(作成中)「Optimizing UE4 for Fortnite: Battle Royale – Part 2| GDC 2018 | Unreal Engine」の日本語メモ

  • (作成中)「Optimizing UE4 for Fortnite: Battle Royale – Part 2 | GDC 2018 | Unreal Engine」の日本語メモです.

 

PC やコンソール向けの設定

  • Movable なディレクショナルライト
    • カスケードシャドウマップ
    • RTDF
  • Movable なスカイライト
    • DFAO, SSAO
  • ローカルライト
  • マテリアル
    • 物理ベース
    • サブサーフェススキャッタリング
    • 植物用の両面シェーディング(Two-sided foliage)
  • エフェクト
    • ボリューメトリックフォグ
    • ライトシャフト
    • GPU パーティクルシミュレーション
    • フォレッジのアニメーション
  • ポストプロセス
    • ブルーム
    • オブジェクトの輪郭線
    • ACES トーンマッパー
  • AA
    • Temporal AA

 

モバイル向けのグラフィックスの設定

  • ※ モバイルフォワードっぽいです.
  • Movable なディレクショナルライト
    • カスケードシャドウマップ
  • Movable なスカイライト
  • ローカルライト : なし?
  • マテリアル
    • 物理ベースを近似したシェーダ
  • エフェクト
    • GPU パーティクルシミュレーション
  • ポストプロセス
    • トーンマッパーのみ
  • AA
    • MSAA

 

スケーラビリティグループ

 

フレームレートのターゲット

  • ターゲット FPS は 60 だけど, VSync は 30FPS
    • CPU や GPU を最大限に使うと, 発熱の問題が起きてクロックが下がる, バッテリーを使いすぎる

 

デュアルコアの iOS デバイス

  • 下図は iPhone 6S の場合です.
  • 従来的なゲームスレッド(青)と…
  • レンダースレッド(紫)
    • Stat_FMobileSceneRenderer_Render : 21.97 msec
      • STAT_InitVIewsTime
      • STAT_BasePasssDrawTime : 14.71 msec
  • 1 個タスクスレッド(赤)が非同期タスクを処理する, 主にストリーミング用
  • iPhone7 は速い2コアと, 効率重視の2 コアがあるけど, そのうちの 2コアしかアクティブにならない

 

4コア以上の iOS デバイス ( iPhone8, iPhoneX)

  • 下図の数値は iPhoneX の場合
  • スレッド構成
    • GameThread : 青
    • RenderThread : 水色
      • FDrawSceneCommand : 11.24 msec
      • STAT_EventWait : 17.98 msec
    • TaskGraphThreadNP0
    • TaskGraphThreadNP1
    • TaskGraphThreadNP2
    • TaskGraphThreadNP3
    • AudioThread
  • iPhone8 と iPhoneX は速い2コアと効率的な4 コアがある
  • なので, 3 個のタスクスレッドを追加して以下の処理をしている
    • アニメーションの Eval の並列化
    • パーティクルシミュレーション
    • 物理タスク
    • 非同期のシーンクエリ
    • テクスチャストリーミング
    • シーンのカリングやレンダリング
  • それと Audio スレッド (一番下の黄緑)

Android デバイス

  • 下図は Samsung Galaxy S8 と Adreno GPU の場合
    • 4 コアあって, 2 コアが大きい?(big), 2 コアが小さい?(little)
  • スレッド構成
    • ゲームスレッド
    • RenderThread
    • RHIThread
    • TaskThread NP0
    • TaskThreadNP1
    • TaskThreadNP2
    • TaskThreadNP3
    • AudioThread
  • OpenGL コマンドのサブミットに RHI スレッドを使っている
    • OpenGL のドライバの遅さがネックになっているので, RHI スレッドが有効な場面
    • RenderThread で抽象化コマンドを作る(OpenGL に関係なく, 描画の抽象化コマンドの並列生成が可能)
    • その後, RHI スレッドで抽象化コマンドを元に OpenGL API を叩く
      • RHI スレッドがフルで働いている状態
  • ※ Android 対応は進行中(WIP)

 

ドローコール

 

オクルージョンカリング

  • モバイルデバイスでは(デプスプレパスがなくて)ベースパスだけでメッシュは 1 回描画とのこと.
    • モバイルフォワードレンダリング

 

Destructable HLOD

  • 「Destructable HLOD」を追加するために, HLOD ツールにテコ入れをした
  • 一番下の LOD のメッシュをマージして, テクスチャアトラスを作って 1 ドローコールにした
  • 頂点カラーに ObjectID を仕込んで, 破壊されたオブジェクトは隠した(詳しくはテクニカルアートのセッションで)

 

プレイヤーが組み立てる壁

  • ポリゴン数が多く, 従来的な LOD だとうまくいかない
  • プレイヤーが組み立てる壁にはカスタム LOD を使っている
  • ポリゴン数の削減が主な目的
  • ハイエンドでは頂点アニメーションだが, モバイルでは完全なモデルを用意してマスクマテリアルを表示・非表示を切り替えて, 完全にできたら不透明シェーダに差し替える

 

UE4.20 でのモバイル向けの機能の予定

 

キャラクターの LOD

 

 

ドローコールの最適化

  • 典型的な都市の建物は 300-400 個の破壊可能なピース
  • 全てのライティングは動的で時間変化がある, ベイクはなし.
  • Tilted Towers(マップ名?)は 15 の建物で( シャドウなし?で) 大体 2000 ドローコール
  • 通信プレイ(協力や対戦)ではプレイヤーが建物の裏に隠れるので, アグレッシブなカリングはうまくいかない

 

HLOD を超えて

  • 建物の破壊中のドローコールを 1 個に減らすのが目的
  • それぞれの建物の破片は かなりの低品質(Ultra Low)でシルエットが一致する手作り LOD (500 破片以上)が飛鳥だった
  • シェーディングの見た目を保つために, カスタム編集の法線を可能限り使っている

DHLOD : エンジンの設定

  • ワールドごとに HLOD+ の設定として HLODSetupAsset にコンテナとして定義がある
  • 2つ目の階層を追加して, 「0 レベル目の Simply Mesh 」を無効にすると, DHLOD が有効になる
  • MergeSettings の下の Merge マテリアルをセットして, 破壊用のオーバーライドのマテリアルをを設定する必要がある

 

破壊の可視化

  • それぞれの破片は頂点カラーによって一意な 2D のインデックスが割り当ててられている
  • 建物ごとに, G8 フォーマットのレンダーターゲットを作っている
  • 破片を破壊するには, 破片のインデックスの箇所に黒のテクセルを描画している
  • 頂点カラーを UV として変換して,レンダーターゲットの値を読んで頂点シェーダでを縮退している

 

DHLOD の比較

  • 左: オリジナルのメッシュ, 70000 トライアングル, ストリーミング
  • 真ん中 : HLOD0(DHLOD), 5462 トライアングル, ストリーミング
  • 右 : HLOD1(ProxyHLOD), 1150 トライアングル, 常にロード

Leave a Reply

Your email address will not be published.

one + five =

This site uses Akismet to reduce spam. Learn how your comment data is processed.