BLOGブログ

2019.08.09UE4

[UE4]アーティスト側で対応できる最適化の作業

執筆バージョン: Unreal Engine 4.22

今回はとあるプロジェクトで実際に行ったアーティスト側で対応できる最適化の作業について簡単に紹介いたします。
紹介する内容は、ポリゴンの削減、LODの設定、テクスチャサイズの制限、バウンズの設定です。

最適化はプロファイルをとって、どこから最適化するか、チームで話し合ってから進めましょう。
闇雲にあちこち手を付けると、そんなに負荷になっていないところも削ってしまい、クォリティが下がってしまうかもしれません。
プロファイルを取ってみたい!!というかたはこちらに神スライドがございます!
アーティストの為のプロファイル入門!~楽しいRenderDocの使い方~
Epic Games Japan 斎藤 修様

 

ポリゴンの削減

ポリゴンをどの程度削るのか、それを確認するのに便利なのがQuad Overdrawです。
View Mode > Optimization Viewmode > Quad Overdraw で確認できます。

このビューではポリゴンが重ね描きされている部分を可視化してくれます。
描画されるサイズに対して、ポリゴン数が過剰すぎると、青以外の色で表示されます。
このビューで見たときに青以上になっている部分からリダクションをかけていくと良いと思います。

スタティックメッシュのリダクションは以下の部分にあります。
StaticMeshのDetail > LOD0 > ReductionSettings

もしプレイヤー(カメラ)が近づいたときには現状のポリゴン数で良いけれども、離れたときにポリゴンが過密状態になる場合はリダクションではなく、LODで対応しましょう。

LODの設定

前述の視点(距離)によってポリゴン数を変更したい場合はLODを使うと効果的です。
遠くからも見る可能性のあるスタティックメッシュや、スケルタルメッシュ、パーティクルやテクスチャ等、さまざまなものにLODは設定可能です。

スタティックメッシュやスケルタルメッシュのLOD設定はアセットとして保存できるため、共通したLODは設定を行いたいときに便利です。

ただし使わないLODは単に容量を取ってしまうだけなので、必要なときにだけ設定しましょう。

LODが意図したどおりに設定されているかどうかは、ゲームをプレイして以下のコンソールコマンドを入力すると、LODの段階ごとにメッシュを色分けしてくれるので確認しやすいと思います。

viewmode LODColoration

ビューポートのビューモードからも確認できます。

どのLODがどの色で表示されるのかは公式ページをご参照ください。
https://docs.unrealengine.com/ja/Engine/UI/LevelEditor/Viewports/ViewModes/index.html#lod%E5%BD%A9%E8%89%B2

LODの自動生成については弊社ブログ記事がありますので、興味のある方は合わせて読んでみてください。
http://historia.co.jp/archives/12346/

 

テクスチャサイズの制限

使用するテクスチャが場合によっては4Kサイズなどの大きなサイズの場合や、遠景でしか映らないものや小物等に不要に高いサイズのテクスチャが用意されていることがあります。
そうした場合はテクスチャ設定のMaximumTextureSizeでテクスチャサイズの上限を設定すると便利です。

LODBiasを上げても同じようにテクスチャ上限を設定できますが、こちらの場合はもとのテクスチャのサイズのままパッケージされます。MaximumTextureSizeを使用するとパッケージサイズも指定したサイズになります。元のテクスチャサイズをそのまま使うことが無いのであれば、Maximum Texture Sizeでサイズを制限したほうが良いと思われます。

実際にゲーム中にテクスチャのどのサイズ(mipmapレベル)が使用されているか調べてから、テクスチャサイズの上限値を決めると良いかと思います。調べる場合はゲーム実行中に以下のコンソールコマンドでlogが取れます。

memreport -full

コマンドを実行すると/Saved/Profiling/MemReports のフォルダ内にマップ名とタイムスタンプがタグ付けされた .memreport ファイルが生成されています。
その一部に、ゲーム中使用されているテクスチャの元サイズと実際に使用されているサイズが表示されています。


上記の例ですと、4Kのテクスチャが1Kに落とされて使用されています。
このテクスチャを使用したオブジェクトに対して、Logを取った状況よりも近づくことがなければ1Kを上限にしてしまって良いでしょう。
Logは取ったその瞬間の状況をレポートを取ってくれているので、プレイヤーが自由に動ける場合は1箇所だけでLogを取って判断しないように注意が必要です。

カリング(バウンズ)の設定

処理を軽くする上では、画面外のものをなるべく描画しないように設定する必要があります。
背景に使用しているスタティックメッシュやキャラクターのスケルタルメッシュに必要以上に大きなバウンズが設定されていると、視界に入っていないにもかかわらず常に描画されているときがあります。バウンズはそのメッシュが完全に視界外になったときに、バウンズの範囲外になるように設定しましょう。
以下の例はだめなバウンズの例です。プレイヤー(グレイマン)の背後にあるオブジェクトなので描画しなくてもよいのですが、
バウンズが大きすぎるために視界に入っていないのに描画されてしまいます。

また、逆に小さすぎても視界に入っているはずなのに描画されない、といった問題が発生する場合があります。
以下の画像はわざとバウンズを小さくしたため、バウンズより外側にメッシュがある状態になっています。
メッシュが見える状況なのに、バウンズの判定がない状態があるため、バウンズの判定が取れる状態になったときに急に視界内にBoxが描画されてしまいます。


また、スケルタルメッシュの場合、ルート以下のボーンをアニメーションしてもバウンズの位置は変わらないため注意が必要です。
(以下の画像のようなスキニングはキャラクターではなく基点から離れて作ったプロップにあとから骨を入れるなどのときに発生するかもしれません。)


またバウンズを適切に設定してもカリングができない状態だと意味がありません。
例えば背景が一つのスタティックメッシュになってしまっていて、どこを見ていても背景すべてが描画されてしまう…などといった例です。スタティックメッシュは適度にカリングできるように分割されたアセットにしておきましょう。

この記事での紹介は以上になりますが、アート側で作業できそうな最適化はこの他にも、ライトとシャドウ、パーティクル、マテリアルや半透明処理、アニメーションなどなど、多岐に渡ります。いずれの最適化の場合でも、まずプロファイルを取ってからの最適化の着手をおすすめいたします。(早めの最適化着手もおすすめします!)