UE4アセットリダクション手法紹介
Epic Games Japan / Support Manager
Nori Shinoyama
アセット最適化のためのUE4機能紹介
アセット最適化のためのUE4機能紹介
処理負荷/メモリ/ロード時間/パッケージサイズ…
アセットは大量に作成され、様々な領域に影響を及ぼします。
UE4はエディタ内に様々なアセットリダクション機能がありますが、
無闇にアセットをリダクションすると、
負荷は改善しないのにクオリティを下げてしまうこともあります。
アセット最適化のためのUE4機能紹介
今回UE4のアセットリダクション機能の各種が、
何を削減し何に対して効果があるのかを簡単にまとめてみました。
1. Polygon Reduction / LOD
2. Actor Merge / HLOD
3. LOD Bone Reduction
4. Animation Compression
5. 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の負荷軽減有益
カリング効率低減によるGPU負荷の増加の可能性
視野外のポリゴン描画が多くなる可能性
副作用
Polygon Reductionを行わないとGPU負荷は減りません
設定を忘れずに
影響薄
HLOD
カリング効率低減によるGPU負荷の増加の可能性
視野外のポリゴン描画が多くなる可能性
DrawCall削減によるRenderThreadの負荷軽減有益
副作用
Polygon Reductionを行わないと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. Polygon Reduction / LOD
2. Actor Merge / HLOD
3. LOD Bone Reduction
4. Animation Compression
5. Texture Resize
End…

UE4アセットリダクション手法紹介