45.6K Views
April 27, 18
スライド概要
処理負荷/メモリ/ロード時間/パッケージサイズ…アセットは大量に作成され、様々な領域に影響を及ぼします。そのため、UE4はエディタ内に様々なアセットリダクション機能があります。しかし、無闇にアセットをリダクションすると、負荷は改善しないのにクオリティを下げてしまうこともあります。
今回UE4のアセットリダクション機能の各種が、
何を削減し何に対して効果があるのかを簡単にまとめてみました。(Audioは間に合わずでごめんなさい!調べてちゃんとまとめたいと思います。)
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
UE4アセットリダクション手法紹介 Epic Games Japan / Support Manager Nori Shinoyama
アセット最適化のためのUE4機能紹介
アセット最適化のためのUE4機能紹介 処理負荷/メモリ/ロード時間/パッケージサイズ… アセットは大量に作成され、様々な領域に影響を及ぼします。 UE4はエディタ内に様々なアセットリダクション機能がありますが、 無闇にアセットをリダクションすると、 負荷は改善しないのにクオリティを下げてしまうこともあります。
アセット最適化のためのUE4機能紹介 今回UE4のアセットリダクション機能の各種が、 何を削減し何に対して効果があるのかを簡単にまとめてみました。 1. 2. 3. 4. 5. Polygon Reduction / LOD Actor Merge / HLOD LOD Bone Reduction Animation Compression Texture Resize
備考 • Audioアセットに関しては今回含まれておりません – 篠山の勉強不足です。後日Audioは別枠としてまとめます。 • 検証バージョンはUE4.18~4.19となります。
LOD & Polygon Reduction
UE4はエディタ内部で自動的にLODとそれに合わせた Polygon Reductionをする機能があります。
Static Mesh LOD & Polygon Reduction
Skeletal Mesh LOD & Polygon Reduction
備考: Static Mesh のPolygon Reductionは二種類から選べる • Editorの Mesh Simplificationで設定可能 – UE4内製 or Simplygon
Polygon Reduction & LOD 有益 GPU負荷の削減 (Early Z-pass, Shadow pass, BasePassで効果的) 影響薄 Render Thread(Draw) ポリゴン数が減ってもドローコール数が減るわけではない 副作用 ロード時間とメモリ LODモデルを沢山持つことは、その分のデータ増加の懸念
どのオブジェクトを、どれぐらいの遠さに、 どれぐらいのポリゴン数で置いたら良いのだろうか??
Polygon Reduction & LOD どのように効果を測定するか? 頂点計算負荷の高いオブジェクトの選出 BasePassの負荷を見ながら探す手法 • UE4のみで確認する手順 1. r.screenpercentageを下げて、出力解像度を下げる。 2. r.RHISetGPUGaptureOptions 1にして ProfileGPUコマンドで計測 DrawCall単位の描画負荷を頂点負荷として確認 • 各種プラットフォームGPUプロファイラで頂点負荷を確認
備考: r.RHISetGPUCaptureOptions コマンド • これをONにすることで、BasePass内部の各DrawCall毎の処理負荷 を出力してくれます – ※RHIThreadがOffになり、DrawThread負荷が急激に増えます – CPU負荷計測時や常時ONはやめましょう
動的にLODを変化させるコマンド 大雑把な調査には非常に便利 • SkeletalMesh – r.skeletalmeshlodbias: LODのOffsetを調整 – r.skeletalmeshlodscale: LODの距離をスケーリング • Static – r.StaticMeshLODDistanceScale: LODの距離をスケーリング – r.forceLOD: 任意のLODに一律で設定 これらを使い、どの距離で、 どのぐらいのオブジェクトが必要かを大まかに検証できます
4.20から… 最小LODを指定し、それよりも詳細なLODモデルをCook時に省くこ とが可能になるそうです。 これにより、例えば、 – PC/Console • LOD0の一番クオリティの高いモデルから全て持つ – Mobile • LOD2からそれ以下のモデルだけを持つ という設定が可能になり、それぞれのプラットフォームに最適なア セットサイズを、一つのアセットで達成することが可能になります。
HLOD / Actor Merge
HLOD / Actor Merge レベル上の複数のメッシュを一つのメッシュにまとめる機能
Merge Actors 複数のStaticMeshを一つのStaticMeshに変換する
Merge Actors 複数のメッシュを選んで Outliner上で右クリック Developer Toolsから設定 エディタを開くことが可能
HLOD 複数メッシュをまとめたLODモデルを作成し、 遠景の場合はそのまとめたメッシュを使ってレンダリングする
HLOD レベル単位で HLODのOn/Offを設定 HLODのクラスタリングや 生成メッシュを設定するエディタ
備考: HLOD / Merge Actorsの Polygon Reduction 機能 HLOD/Merge Actorsどちらにも Polygon Reduction機能があります 4.19から、Simplygonを使わない独 自のPolygon Reduction機能も使用 できるようになっています。
Merge Actors 有益 DrawCall削減によるRenderThreadの負荷軽減 影響薄 Polygon Reductionを行わないとGPU負荷は減りません 設定を忘れずに 副作用 カリング効率低減によるGPU負荷の増加の可能性 視野外のポリゴン描画が多くなる可能性
HLOD 有益 DrawCall削減によるRenderThreadの負荷軽減 影響薄 Polygon Reductionを行わないとGPU負荷は減りません 設定を忘れずに 副作用 カリング効率低減によるGPU負荷の増加の可能性 視野外のポリゴン描画が多くなる可能性 ロード時間とメモリの増加 HLODモデルを沢山持つことは、その分データが増える
HLODデータはレベルに紐付いて作成されます ロード時間とメモリーの増加は必ず確認を Memreportなどでメモリ消費量をチェック
Merge Actor と HLODの注意点2つ • 注意点1: Material MergeしないとDrawCallは減りません • 注意点2: シーン内の同一オブジェクトのマージは別オブジェクトに
注意点1. MaterialをMergeしないとDrawCallは減りません
注意点1. MaterialをMergeしないとDrawCallは減りません 3つのマテリアルのオブジェクトをマージしても。。。
注意点1. MaterialをMergeしないとDrawCallは減りません レンダリングはマテリアル単位で行われるので、 ドローコール数は減りません
注意点1. MaterialをMergeしないとDrawCallは減りません マテリアルをまとめることドローコールが一つになります
注意点2. シーン内の同一オブジェクトのマージは別オブジェクトに
注意点2. シーン内の同一オブジェクトのマージは別オブジェクトに 同一のアセットをシーンに置いていたとして…
注意点2. シーン内の同一オブジェクトのマージは別オブジェクトに 同じLODモデルが別Static Meshとして作成されてしまいます このような場合は独自でメッシュを差し替える方が良いかもしれません
LOD Bone Reduction
LOD Bone Reduction Skeletal Meshの動くBoneをLOD毎に設定する機能
LOD Bone Reductionのコンセプト こんな遠くのキャラクター LODは効いてポリゴン数少 なくても。。。 ボーンは全部計算される 指のボーン計算しなくても バレないのでは??
消したいSkeletonを選択して右クリックで、 どのLODで省くかを設定可能
LOD Bone Reduction 有益 影響なし 副作用 CPU上のBone計算(Evaluation)の負荷削減 複雑なAnimGraphを使用している場合特に効果的です。 基本的には、Main ThreadではなくWorker Threadの処理削減です GPU側の負荷削減には繋がりません 若干あるかもですが、こちらで観測できていません 遠景のアニメーションクオリティの低下の懸念 大丈夫かどうかの確認をお願いします。
Animation Compression
Animation Compression 各Animation Sequenceの圧縮形式を設定可能
Animation Compression 有益 副作用 メモリ、ロード時間の削減 メモリ上で圧縮を展開したりしません。 圧縮データから直にアニメーションデータを読み込みます アニメーションクオリティの低下 適切な圧縮方式を選ぶことが必要
“CompressAnimations” Commandletで 全アニメーションを一括で圧縮可能 • コマンド例 – UE4Editor-cmd.exe [ProjectPath] –run=CompressAnimations • Project Settingsで、コマンドの圧縮形式の設定が可能 • アセット毎に、 この一括圧縮をしないと設定することも可能
Animation Compression 圧縮されたデータ量のチェック1 Content Browerで圧縮率とサイズがわかります
Animation Compression 圧縮されたデータ量のチェック2 圧縮率: 小 圧縮率: 大 Cook後の Animation Assetsのサイズ Memreportで見る AnimSequenceのメモリ量
圧縮率: 小 圧縮率: 大 例はThirdPersonで6個しかAnimSequenceがありませんが。。 割合で言うと50%以上の差がある場合も。 圧縮設定でメモリ消費量が大きく変わる可能性があります。 細かくチェックしましょう
Animation Compression 各項目の設定方法 • 設定内容について細かく説明しているブログがあります – https://nfrechette.github.io/2017/01/11/anim_compression_unreal4/ • また、4.20でAnim Compressionを大幅に改善するように 現在制作中です。
Texture Resize
Texture Resize パッケージサイズ, メモリに優しい 有益 GPU描画も高速に (キャッシュに乗りやすいためレンダリング速度向上の可能性あり) 副作用 テクスチャクオリティの低下 許容できるか、様々なシーンで確認が必要
Texture Resize 各テクスチャの設定 • UE4 Editorにインポートしたものと、 ゲームで読み込まれるサイズの確認 • Cook時に既に適用されるので、実機用のテクスチャはリサイズさ れた状態。 – パッケージサイズやロード時間にも影響
Texture Resize 各テクスチャの設定 • Gameで読み込むLODを変更する”LOD Bias” しかし、これは各プラットフォームで共通
Texture Resize Cook後のTextureのサイズの確認 LODBias = 0 LODBias = 2 UE4 マネキンのテクスチャのサイズの確認
Texture Resize Platform毎での一括設定 • 各プラットフォームのDeviceProfile.ini のLODBiasを各 TextureLODGroupsで設定することにより、 そのグループを設定されたテクスチャ全ての最小LODを変更できる • Platform毎に別々の設定ができるが、グループ単位で一括の設定
アセット最適化のためのUE4機能紹介 1. 2. 3. 4. 5. Polygon Reduction / LOD Actor Merge / HLOD LOD Bone Reduction Animation Compression Texture Resize
End…