60fpsアクションを実現する秘訣を伝授 解析編【UNREAL FEST EAST 2019】

42.8K Views

October 08, 19

スライド概要

講演動画:https://youtu.be/YXGmiWzHxeo
基礎編:https://www.docswell.com/s/EpicGamesJapan/53M7JK-UE4_UFE19_Soleil_60fpsAction_Basic

2019年10月6日に行われた「UNREAL FEST EAST 2019」における「60fpsアクションを実現する秘訣を伝授」の登壇資料です。
●公式サイト
https://unrealengine.jp/unrealfest/
===
発売中のタイトル「NARUTO TO BORUTO シノビストライカー」に開発中のプロジェクトの事例も加えて、60fpsアクションゲームを実現するためのポイントや、パフォーマンス・チューニングについて解説します。おまけとして「NARUTO TO BORUTO シノビストライカー」のグラフィック面の技術を紹介。

profile-image

Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/

シェア

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

60fpsゲームのために 解析編 Winter Crown WORKS 梶井 祐 協力: ソレイユ株式会社 尾田 委久 協力: Winter Crown WORKS 石濃 潤一郎 #ue4fest

2.

梶井 祐 • IndieGame Studio WinterCrownWORKSのプログラマー。 主に分野はグラフィックスプログラム。 仕事では各会社様からパフォーマンス関連のご相談を承って おります。 WinterCrownWORKSのアーティスト石濃、プログラマー梶 井で、アーティストとプログラマー両方の視点から改善案、 サンプル提供、エンジン改造などを行っております。 ご相談の際には contact@winter-crown-works.com までお気軽にご連絡ください。 #ue4fest

3.

はじめに • この解析編は基礎編でも触れた基本的な問題をクリアしてい る前提でのお話になります。 なので、「そんなところまで見るの?」と思う事もあるでし ょうが、より多くのものを画面に出しつつ、クオリティを出 そうと思うと必要になってきます。 • ここではより低レイヤーに近いところから解析、説明をして いきたいと思います。 #ue4fest

4.

目次 1.GraphicsをProfile 2. 軽量化、高速化に入る前に ...p7 ...p14 3.Maskedなマテリアル ...p17 4.BasePass 5.アセットについて 6.Translucency ...p69 ...p127 ...p179 7.PostProcessに関して ...p201 8.CPU軽量化、最適化 ...p214 9.オマケメモリに関して ...p267 10.総括 11.参考文献 ...p283 ...p289 #ue4fest

5.

テストに使ったPCの構成 • CPU i7-6700K 4GHz • グラフィックボード NVidia Geforce GTX 750 Ti • メモリ 64GB #ue4fest

6.

GraphicsをProfile #ue4fest

7.

ProfilingTool • コンソールは各コンソール専用のものがある。 • PC側も様々なものがあり、お手軽なものから低レイヤーの値 を見るものまで。 -PIX -RenderDoc -NSight -Radeon GPU Profiler …等々 #ue4fest

8.

Profilerで見ると何がいいの? • より詳細な情報が得られる(情報の精度、範囲はProfiler次第) - どんなデータがセットアップされたのか、シェーダース テージ間では何が受け渡されているのか? - 実際に描画されたポリゴン数は?ピクセル数は? - 計算が重いのか?テクスチャのアクセスか? #ue4fest

9.

この度使うProfilerはNSight 2019.5 • ダウンロードしてすぐ試せる。 • 低レイヤー部分の調査が出来る。(根拠のために必要) • NVIDIA様のドキュメントやBlogで多くの情報が得られる。 低レイヤーの情報も多く載っている。 • 【今人気のプラットフォーム】の解析に近 い感覚 #ue4fest

10.

NSight • NVIDIA 様のサイトより(翻訳): NVIDIA Nsight Graphicsは、グラフィックアプリケーション のデバッグとプロファイリングのためのスタンドアロンアプ リケーションです。 Nsightは、DirectCompute、Direct3D(11、12、DXR)、 OpenGL、Vulkan(1.1、NV Vulkan Raytracing Extension )、Oculus SDK、およびOpenVRで構築されたアプリケーシ ョンをサポートしています。 #ue4fest

11.

実行してキャプチャ → Profile結果 #ue4fest

12.

注意:管理者モードで実行にチェック • デフォルトの場合実行する際は常に管理者モードにしないと FrameCaptureが出来ない。 もしくは管理者以外にも カウンタを公開する。 #ue4fest

13.

軽量化、高速化に入る前に #ue4fest

14.

どんな問題がある? • • • • • Lightの置きすぎによるLighting負荷 広範囲に半透明を重ねすぎたOverDraw負荷 高解像度、テクスチャ枚数多すぎのマテリアル負荷 PostProcessによるフィルター負荷 草原、森の作り方によるMaskedMaterial負荷 等々・・・・。 #ue4fest

15.

ゲームエンジンを使用しても、なんでも お任せとはいかない・・・。 • 大前提として - デバイスの性能を上回る事はない - デバイスの影響は必ず受ける デバイスの性能を使い切るために Profileingを行い正確な情報を得る。 #ue4fest

16.

Maskedなマテリアル #ue4fest

17.

え?重いの? • 4.16で入ったMask Material only in Early Z-pass使ったら 軽くなるんじゃなかったっけ? 参考文献:Mask Material only in Early Z-passの効果と仕組 み • 抜きを使ったらポリゴン数少ないでしょ?軽いんじゃない の? #ue4fest

18.

整理しましょう。 • Mask Material only in Early Z-pass MaskedMaterialのBasePassの負荷は下がります。 が、 MaskedMaterialのすべてが解決する訳ではない。 • 板ポリの積極運用でポリゴンを減らす 抜きを使ってポリゴン数を減らして行っても、頂点数がボト ルネックのケースでない限りは効果は微妙 #ue4fest

19.

ポイント • Prepassの負荷 • ShadowDepthの負荷 • BasePassの負荷 Mask Material only in Early Z-pass で対処されるのはBasePassについて。 他の描画パスでは注意が必要。 #ue4fest

20.

Masked Material の実行 MaskMaterialOnly in Early Z pass未使用 • Prepass(Masked又は描画 しない) • BasePass(Masked) • ShadowDepth(Masked) MaskMaterialOnly in Early Z pass使用 • Prepass(Masked) • BasePass(Opaque) • ShadowDepth(Masked) #ue4fest

21.

BasePassはOpaqueだが他は・・・ • PrepassとShadowDepthにおいてはMaskedでレンダリング される。 つまりBasePass以外では依然としてMasked特有の制限を受 ける。 #ue4fest

22.

テストをしてみよう。 • 葉っぱ部分がMaskedMaterialで出来ています。 #ue4fest

23.

負荷の内訳 • Prepass 1.34ms • ShadowDepth 1.42ms • BasePass 2.31ms #ue4fest

24.

まずはPrepassを見てみる • 木の葉部分のみのDrawCallで 1.34msの内、1.06msも使わ れている。8割以上が葉っぱに使われている #ue4fest

25.

たかがこの程度の画面にしては重い • 60fpsは16.6ms その内1msがPrepassは妥当に見えますが、 画面の物量から見ると重すぎるように思える。 画面にもっとオブジェクトを載せたいのでもう ちょっと軽くしたいとか思いますよね? この際にやるべきことはポリゴンを削る事でしょうか? #ue4fest

26.

葉っぱ部分をProfile #ue4fest

27.

RangeInfo • DrawCall Count 1 Profileをかけた範囲で発生したDrawCallが1つ。 • API Primitive Total / Avg 投入されたポリゴン数の合計 / DrawCall辺りの平均 • Shaded Pixel Total / Avg ピクセルシェーダーの動作したフラグメント数 / DrawCall辺 りの平均 *PrepassでOpaqueマテリアルは 0 で計上される。(PDO を使ってない場合) #ue4fest

28.

PipeLineOverView • TOP SOL 各ワークロードの実行効率が最大理論値にどれだけ近いかの 割合 ここでは一番大きい値から5つ並べられます。 おおよその原因はこの辺りから順に割り出していきます。(各 ユニットは後述) #ue4fest

29.

GPU ユニット • • • • • • • • PD(Primitive Distribute) = インデックスバッファのロード VAF(頂点属性のフェッチ) = 頂点バッファの読み込み SM(ストリーミングマルチプロセッサ) = シェーダーの実行 FMA fp32(FADD,FMUL,FMAD) = 32bit浮動小数演算 ALU = 整数および論理演算 FP16 = 半精度の計算 SFU = 三角関数等(rsqrt,cos/sin ) TEX = SRV,UAVのフェッチ #ue4fest

30.

GPU ユニット • • • • • • VPC L2 CROP ZROP VRAM SOL = ViewPort変換、錐台カリング = L2キャッシュ = ColorRenderTargetへの書き込み、ブレンド = 深度ステンシルテストを行う = GPU Video Memory = Speed Of Light 理論値に対する達成率 #ue4fest

31.

SM Section • シェーダー実行に関する値になります。 この辺りは全部を解説しようとすると、複雑になり過ぎるた め、今回のボトルネックに関してだけ解説しようと思います。 SM Activeは100%に近い値が出ているため、ほぼ理論値が出 ている。 Stall部分が計上されているのが確認できる。 #ue4fest

32.

まず見るべき場所 • SOL TEX 100% , ZROP 42.9% , SM 21.9% , L2 20.8% TEXユニットへのアクセスが理論値最大で出ている。(テクス チャアクセスによって速度が制限されている可能性が高い) ZROPが高いのはPrepassは深度の構築なため深度に対する書 き込み、読み込みが多いため。 SMは若干低い気がする。 次にシェーダーの実行周りを見てみる #ue4fest

33.

SM Sectionを詳しく見てみる #ue4fest

34.

どう見る? • SM Active が100%に近いのにStall Long ScoreBoard が非 常に高い。 FS Invocations(ピクセルシェーダーの実行数)が非常に多 い。 #ue4fest

35.

MaskedMaterial おさらい • Prepass は Maskedのままでレンダリング - 抜きの計算のためにPixelShaderが走る 抜きのためのテクスチャアクセスも行われる。 - EarlyZが効かない 深度の裏に回ってもレンダリングされる。その上でピクセ ルシェーダーもテクスチャアクセスも行われるので尚負荷に #ue4fest

36.

α抜きの動作 • 流れ - 頂点シェーダー (画面に入っていた場合) Early Zを通り抜けピクセルシェーダーへ - ピクセルシェーダー OpacityMaskに繋がってるノードを計算。 αテストを通っていれば 深度テストへ(Late Z Test) - 深度テストを抜けた場合、DepthBufferへ出力 #ue4fest

37.

OpaqueMaterielの動作 • 流れ - 頂点シェーダー (画面に入っていた場合) 深度テスト(EarlyZ) - 深度テストを抜けた場合DepthBufferへ出力 ピクセルシェーダーは走らず、テクスチャアクセスも頂点で のフェッチまでしか発生しない。 #ue4fest

38.

EarlyZ(PreZ),LateZ(PostZ)に関して • ちょっとだけお話させて頂きます。 パイプライン上、深度テストのタイミングがより早い段階で 行われるものがEarlyZ。 深度テストがもっとも遅いタイミングで行われるものがLateZ になります。 尚、説明を簡略化するため、ReZの説明は省かせて頂きます。 #ue4fest

39.

描画パイプラインの深度テストの流れ 三角形 HiZ(階層Z/ステンシルテスト) EarlyZ(Z/ステンシルテスト) ピクセルシェーダー LateZ(Z/ステンシルテスト) カラーブレンド、出力 #ue4fest

40.

EarlyZ(PreZ) の深度テストの流れ • OpaqueMaterialがPrepass, Basepass,Shadowで行う 深度テストの流れです。 ピクセルシェーダー実行前に リジェクトできるので高速 三角形 HiZ(階層Z/ステンシルテスト) EarlyZ(Z/ステンシルテスト) ピクセルシェーダー カラーブレンド、出力 #ue4fest

41.

LateZ(PostZ) の深度テストの流れ • MaskedMaterialがPrepass時、 またはShadowDepth時に 行う深度テストの流れです。 ピクセルシェーダー実行後に リジェクトするので低速 三角形 HiZ(階層Z/ステンシルテスト) ピクセルシェーダー LateZ(Z/ステンシルテスト) カラーブレンド、出力 #ue4fest

42.

HiZって? • タイル単位に低精度で行う深度テスト 大雑把に大きい範囲で行うため、リジェクト自体は高速。 手前で大きい面積が深度でおおわれてるケースで効率的。 ハードウェアによってタイルのサイズは8x8,16x16等になる。 深度のビット幅も狭いので、本当に荒く深度テストを行う。 タイル分まるっと覆われてないといけない。 EarlyZ,LateZのどちらでも有効。 #ue4fest

43.

PrepassはMaskedの面積はそのまま負荷 に • 深度の裏に回った分もすべて負荷になる。 Maskedでレンダリングする際には、画面で見えてる以上に負 荷が高い という事に注意が必要。 今回の場合FS Invocationsが非常に多く、その上で TextureAccessも多い状態。 FS Invocationsはピクセルシェーダーが呼び出された数。 #ue4fest

44.

対処方法は? • 基本は面積を減らす事 裏に回っていてもピクセルシェーダーが走るため、重なる面 が多いほど負荷になる。 MaskedMaterialを減らす、頂点がボトルネックにならない程 度に抜きの形をとり重なる面積を減らす、面積を減らす為に LODを入れる、等が効果が出てくる。 *QuadOverDrawでは確認できないので注意 #ue4fest

45.

軽量化してみよう :少々変化球を用意し てみました。 • 実はLODモデルに仕込みがあり、Maskの領域が減っています。 #ue4fest

46.

モデルの構成: #ue4fest

47.

何をしたのか? LOD1からOpaqueのモデルが仕 込まれている 解説 • 中心に葉っぱの模様の球を Opaqueで入れる事で、葉っ ぱ部分を間引く。 こうする事でMaskの板の重 なりを大きく減らしつつ、 見た目のボリュームを維持。 #ue4fest

48.

計測してみる • Prepass が 1.34ms→0.83ms へ。 Mask部分に関して言えば0.55msと約半分に。 LODの分DrawCallは増えているものの軽量に。 #ue4fest

49.

MaskedMaterialそのものが軽くなった わけではないが・・・ • FS Invocationsが半分以下。 つまり単純に処理の総量が減っている。TEXが100%、Stall Long ScoreBardが高いのはMaskなので仕方ない。(Prepass全体では下がってる) #ue4fest

50.

Prepass まとめ • Mask Material only in early – Z-passを使っても注意が必要 • 重なる面積は最小に • 抜きの形状を綺麗にとるかどうかは配置数やシーン全体のポ リゴン数と相談 • 出来るだけ不必要なMaskを避ける 親マテリアルを意図せずMaskedMaterialで作っただけなんて いうケースも・・・。 #ue4fest

51.

実はShadowDepthも・・・ • ShadowDepthも同じようにMaskedMaterialの影響を強く受 けます。 基本的にはPrepassと同じような負荷の出方をします。 その上で、レンダリング先のバッファ解像度もカスケードの 影響が出てくるため注意が必要です。 Maskedとレンダリング解像度が原因のため細かい解説は飛ば しながら見て行きます。 #ue4fest

52.

LODなしのShadowDepth #ue4fest

53.

ShadowDepth 1.42ms 内訳 • 葉っぱ部分の合計が1ms #ue4fest

54.

ShadowDepth 1.42ms 内訳 • 床の部分もDynamicShadowを落としていた。 面積が広いため、合計が0.25msちょっとぐらい。 落としても見た目が変わらないなら積極的にオミット #ue4fest

55.

軽量化してみよう :Prepassの軽量化と 同じものです。 #ue4fest

56.

軽量版: 0.65ms • 何と半分以下!! #ue4fest

57.

葉っぱ部分の合計が0.45ms前後 • 葉っぱ部分だけを抽出しても半分になっている。(単純に書 き込む面積が減っただけですが) #ue4fest

58.

床はDynamicShadowを落とす先がない • 床部分はDynamicShadowを切りました。 影響する先がないため、切っても見た目が変わらないからで す。 その結果、各Cascadeからも床のDrawCallが消えました。 結果 0.25msの軽量化 #ue4fest

59.

解像度を2048→1024に落とす事でさら に半分の負荷に(見た目は変わる) • 0.30ms #ue4fest

60.

影の解像度は下げても良い? • Maskedの総面積がボトルネックになるという事は? 単純に影の解像度を下げても同じような効果を期待できそう です。 ただし解像度が下がった分、見た目を許容するのかは要確認 になります。 影がボケる、細かい影が消える等は向上する速度とのトレー ドオフ。 #ue4fest

61.

軽量化小ネタ:影モデルの利用 • 影モデル UE4のMeshComponentのRendering設定を調整する事で影 を落とすだけのComponentを配置することが出来ます。 #ue4fest

62.

影モデルを用意してどうするの? • 運用方法 - 影モデルとして配置するものはLODを1段下げる ポリゴン数を抑える効果、maskの場合は書き込みの総面積 の抑制効果による軽量化が出来ます。 - シルエットを合わせた別モデルを用意する。 こちらもMaskedの場合は総面積を減らせますし、シルエッ トを合わせる事でOpaqueMaterialで配置も出来るかも知れま せん。 #ue4fest

63.

ShadowDepthのまとめ • MaskedMaterialはDynamicShadowにも影響 重なる面積で負荷が非常にあがる • こちらもPrepass同様、無駄な書き込み面積を減らす事が重 要 • 解像度は要調整 BaseScalability.iniで各スケーラビリティごとに、 r.Shadow.MaxCSMResolution で解像度が設定されている。 タイトル側でiniファイルを作りスケーラビリティをタイトル の方針に合わせる。 #ue4fest

64.

MaskedMaterialのまとめ • Prepass と ShadowDepthで負荷に影響が出てくる。 重なる総面積に注意。 よく目にするBush(茂み)モデルはパッと見の見た目以上に重 なっているので、負荷が高い。 頂点をただ削られて総面積が変わらないデータを見る事があ りますが、広く重なる面積を減らす方が効果が高い事が多い。 FS Invocations 、Shaded Pixelの数が非常に大きい値になっ てないか確認を。 #ue4fest

65.

気づいたでしょうか? • 軽量化しようとするととっても手間がかかりますね? 軽量化、高速化には手間、コストがかかります。 「今時そこに手をかけるなんてナンセンス」なんて意見もあ る訳ですが、効果の高いやり方ほど手がかかります。 もちろん手間やコストをかけずに済ませられるならそれに越 した事はありません。 より良い知見があれば是非共有を‼ #ue4fest

66.

コストがかかるので • チームが何を求めているのかゴールをはっきりさせましょう。 手間のかかる事は後半には出来なくなります。 作業者も疲弊しているので、タスクを積んでも「無理」とおっしゃられ るか、雑な対応で戻ってくる事も往々にしてあります。 雑な仕事では効果は半減、クオリティにも影響します。 手間のかかる方法を実践する場合は、適応範囲を絞ったり、早々にスケ ジューリング、ワークフローを確立させる、作業者の確保等の戦略を立 てる必要があります。 *マネージメントの段階からの影響が大きい #ue4fest

67.

Maskedで気を付けるシチュエーション • 草原 • 森 • オブジェクトのカメラフェード これらのシチュエーションは負荷がかかる筆頭です。 もし大量に配置が必要な場合、なんらかの方法を確立したり コストをかけないとクオリティを下げる結果になりやすい。 *よく誤解がありますが、InstancingやFoliageを使っても ピクセルシェーダーの負荷は特別軽くなったりはしません。 #ue4fest

68.

Basepass #ue4fest

69.

ここからがNSIGHTの本領発揮です • ShadowDepthやPrepassは深度を書き込むだけの単純なパス なため、「NSightじゃなくてもいいじゃん」というものが多 かったです。 BasePassは非常に動作が複雑なため確認する価値が出てきま す。 時間やページの都合上かなり端折ってはいるのですが、出来 るだけ説明させて頂きます。 #ue4fest

70.

負荷のポイントが分かりづらい • BasePassはシェーダーの動作が複雑な動作をしやすい個所で す。 ノードの組み方自体複雑化するために、本当のボトルネック が隠れやすい。 あからさまなデータ以外はなかなか最適化が難しく、全体を 効率よくシェーダーが走るようにしないと、軽量化の差が出 てこないところも最適化が難しい部分になるかと思います。 #ue4fest