Weitere ähnliche Inhalte Ähnlich wie 60fpsアクションを実現する秘訣を伝授 解析編 (20) Mehr von エピック・ゲームズ・ジャパン Epic Games Japan (20) 60fpsアクションを実現する秘訣を伝授 解析編2. #ue4fest#ue4fest
• IndieGame Studio WinterCrownWORKSのプログラマー。
主に分野はグラフィックスプログラム。
仕事では各会社様からパフォーマンス関連のご相談を承って
おります。
WinterCrownWORKSのアーティスト石濃、プログラマー梶
井で、アーティストとプログラマー両方の視点から改善案、
サンプル提供、エンジン改造などを行っております。
ご相談の際には contact@winter-crown-works.com
までお気軽にご連絡ください。
梶井 祐
10. #ue4fest#ue4fest
• NVIDIA 様のサイトより(翻訳):
NVIDIA Nsight Graphicsは、グラフィックアプリケーション
のデバッグとプロファイリングのためのスタンドアロンアプ
リケーションです。
Nsightは、DirectCompute、Direct3D(11、12、DXR)、
OpenGL、Vulkan(1.1、NV Vulkan Raytracing Extension
)、Oculus SDK、およびOpenVRで構築されたアプリケーシ
ョンをサポートしています。
NSight
18. #ue4fest#ue4fest
• Mask Material only in Early Z-pass
MaskedMaterialのBasePassの負荷は下がります。
が、
MaskedMaterialのすべてが解決する訳ではない。
• 板ポリの積極運用でポリゴンを減らす
抜きを使ってポリゴン数を減らして行っても、頂点数がボト
ルネックのケースでない限りは効果は微妙
整理しましょう。
27. #ue4fest#ue4fest
• DrawCall Count 1
Profileをかけた範囲で発生したDrawCallが1つ。
• API Primitive Total / Avg
投入されたポリゴン数の合計 / DrawCall辺りの平均
• Shaded Pixel Total / Avg
ピクセルシェーダーの動作したフラグメント数 / DrawCall辺
りの平均
*PrepassでOpaqueマテリアルは 0 で計上される。(PDO
を使ってない場合)
RangeInfo
29. #ue4fest#ue4fest
• PD(Primitive Distribute) = インデックスバッファのロード
• VAF(頂点属性のフェッチ) = 頂点バッファの読み込み
• SM(ストリーミングマルチプロセッサ) = シェーダーの実行
• FMA fp32(FADD,FMUL,FMAD) = 32bit浮動小数演算
• ALU = 整数および論理演算
• FP16 = 半精度の計算
• SFU = 三角関数等(rsqrt,cos/sin )
• TEX = SRV,UAVのフェッチ
GPU ユニット
30. #ue4fest#ue4fest
• VPC = ViewPort変換、錐台カリング
• L2 = L2キャッシュ
• CROP = ColorRenderTargetへの書き込み、ブレンド
• ZROP = 深度ステンシルテストを行う
• VRAM = GPU Video Memory
• SOL = Speed Of Light 理論値に対する達成率
GPU ユニット
32. #ue4fest#ue4fest
• SOL
TEX 100% , ZROP 42.9% , SM 21.9% , L2 20.8%
TEXユニットへのアクセスが理論値最大で出ている。(テクス
チャアクセスによって速度が制限されている可能性が高い)
ZROPが高いのはPrepassは深度の構築なため深度に対する書
き込み、読み込みが多いため。
SMは若干低い気がする。
次にシェーダーの実行周りを見てみる
まず見るべき場所
35. #ue4fest#ue4fest
• Prepass は Maskedのままでレンダリング
- 抜きの計算のためにPixelShaderが走る
抜きのためのテクスチャアクセスも行われる。
- EarlyZが効かない
深度の裏に回ってもレンダリングされる。その上でピクセ
ルシェーダーもテクスチャアクセスも行われるので尚負荷に
MaskedMaterial おさらい
36. #ue4fest#ue4fest
• 流れ
- 頂点シェーダー (画面に入っていた場合)
Early Zを通り抜けピクセルシェーダーへ
- ピクセルシェーダー
OpacityMaskに繋がってるノードを計算。
αテストを通っていれば 深度テストへ(Late Z Test)
- 深度テストを抜けた場合、DepthBufferへ出力
α抜きの動作
50. #ue4fest#ue4fest
• Mask Material only in early – Z-passを使っても注意が必要
• 重なる面積は最小に
• 抜きの形状を綺麗にとるかどうかは配置数やシーン全体のポ
リゴン数と相談
• 出来るだけ不必要なMaskを避ける
親マテリアルを意図せずMaskedMaterialで作っただけなんて
いうケースも・・・。
Prepass まとめ
64. #ue4fest#ue4fest
• Prepass と ShadowDepthで負荷に影響が出てくる。
重なる総面積に注意。
よく目にするBush(茂み)モデルはパッと見の見た目以上に重
なっているので、負荷が高い。
頂点をただ削られて総面積が変わらないデータを見る事があ
りますが、広く重なる面積を減らす方が効果が高い事が多い。
FS Invocations 、Shaded Pixelの数が非常に大きい値になっ
てないか確認を。
MaskedMaterialのまとめ
67. #ue4fest#ue4fest
• 草原
• 森
• オブジェクトのカメラフェード
これらのシチュエーションは負荷がかかる筆頭です。
もし大量に配置が必要な場合、なんらかの方法を確立したり
コストをかけないとクオリティを下げる結果になりやすい。
*よく誤解がありますが、InstancingやFoliageを使っても
ピクセルシェーダーの負荷は特別軽くなったりはしません。
Maskedで気を付けるシチュエーション
80. #ue4fest#ue4fest
• SM Activeの割合が若干低い
SM Occpancyも低く、シェーダーの実行効率が悪そう。
• Long ScoreBoardが高い
L1の命令キュー待ちが多いほど高くなる。
(SM Occpancyが低くなってる原因ではないか?)
• FS Invocationの値を見ると実行されているスレッド数が多い
マイクロポリゴンが発生していないか?
値をそれぞれ検討してみる。
96. #ue4fest#ue4fest
• Long Scoreboard 、Tex Throttle 共に下がっている。
テクスチャアクセスを減らしたことでL1の待機が減ったと思
われる。(TEXのSOLも下がっている事が確認できた)
• FS Invocationが下がっている。
見た目の面積は一緒だが、マイクロポリゴンやOverDrawが
減った事により、ピクセルシェーダーの実行が減っている。
• SM Active Min/Maxも少し上がっている
多少シェーダーユニットの並列性が上がったものと思われる。
考察
119. #ue4fest#ue4fest
• 主に VertexShader → PixelShader で受け渡されるデータ
このサイズが大きいとシェーダーの実行効率が落ちます。
PSが起動する際、このデータを読み取り終える必要があるた
めです。
こちらは、PS内で使うUVが多い場合(CustomUVでの拡張も
含む)、Vertex InterpolaterノードでPixelShaderへデータを
受け渡した場合にサイズが増えます。
シェーダーステージ間のデータ
190. #ue4fest#ue4fest
• 比較
Particle側 = 0.46ms
板で作成した煙 = 0.06ms
と圧勝でした。
マテリアル単体の負荷は増えても、一枚の板を十分な情報量
にする事でビルボードの数を減らし、結果的に負荷を減らす
事ができました。。
ここでのトレードオフは見た目ではなく手間です。
マテリアル自体は重そうでも
245. #ue4fest#ue4fest
• UCharacterMovementComponent::PhysWalking
while ( (remainingTime >= MIN_TICK_TIME) && (Iterations < MaxSimulationIterations) &&・・・
こんな感じになっていて、Iterations < MaxSimulationIterations の条件から何度も
Iterationしているようです。
このMaxSimulationIterationsは名前の通り、シミュレーションの反復回数の最大
で、ヒット判定を最大でこの回数分繰り返します。
下げるのには不安がありますが、Projectileなどでは半分の4が指定されていたりする。
恐らくゲームによって調整を行ってもいいはず。
C++だと
273. #ue4fest#ue4fest
• BC5 : 4096x4096 mip 13 ≒ 21MB
• BC7 : 4096x4096 mip 13 ≒ 21MB
• DXT5:4096x4096 mip 13 ≒ 21MB
• DXT1:4096x4096 mip 13 ≒ 10MB
• G8 : 4096x4096 mip 13 ≒ 21MB
• RGBA8:4096x4096 mip13 ≒ 86MB
*ただしこれはmipが全部読み込まれた場合のもの,実際には
Streamerが読み込むmipを制御
テクスチャのメモリ 使用例
274. #ue4fest#ue4fest
• Total size: InMem ≒ 546.71 MB
- B8G8R8A8 size: InMem ≒ 72.91 MB
- DXT1 size: InMem ≒ 96.60 MB
- DXT5 size: InMem ≒ 187.54 MB
- FloatRGBA size: InMem ≒ 37.34 MB
- BC5 size: InMem ≒ 69.82 MB
- BC7 size: InMem ≒ 77.42 MB
実際のシーンのテクスチャメモリ例
288. #ue4fest#ue4fest
• RenderHellBook
• The Peak-Performance-Percentage Analysis Method for Optimizing Any GPU Workload
• What is Limiting Your Rendering Performance? Using ‘Nsight Graphics: GPU Trace’ and the Peak-Performance-
Percentage Method
• life-triangle-nvidias-logical-pipeline
• GPU-DRIVEN RENDERING
• Mask Material only in Early Z-passの効果と仕組み
• NSightCompute
• NSight UserGuide
• UnrealInsights
• UE4アニメーションシステム総おさらい
• UE4で多数のキャラクターを生かすためのテクニック
参考文献: