【プロファイリング・Lumen】最適化に苦しんでいる話

 お久しぶりです。今回は最適化のお話をしようと思います。

私が作りたいゲームは特に出来るだけUEの美しさを活かしたゲームにしたいのもあり、新エリアを作成する上で常に付きまとう問題で、早めに対策しておかないと困ってしまうので一旦かなりの時間をかけて考えてみました。(なので他エリアのレベルデザインは全然進んでないよ~泣)

正直、最適化はその人のゲーム、PCスペックなどに依存するものですのでこれが正しいといったやり方は無いと思いますが、自分への覚え書きがてらブログに残します。(ど素人なので間違っている箇所があったら是非教えてください!)

今回はXでも良くスクショを出しているこちらのエリアの最適化を行いました。

それではいってみましょう!!

【目次】
  1. 【PCスペックについて】
  2. 【実際FPSはどれくらいでている?】
  3. 【プロファイリングで重い処理を調べてみた】
  4. 【やはりライトニングは重い】
  5. 【Lumenを使わない選択肢】

【PCスペックについて】

まず、使用しているPCスペックを公開します。
【CPU】Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz  
【メモリ】24GB
【GPU】NVIDIA GeForce GTX 1070

お分かりの通りGPUのスペックが圧倒的に足りないですね…。学生時代頑張ってお金貯めて買ったままで近々買い替えを検討しています。ただ重くて遊べない!となるのは悲しいので一度これでもせめて40~50FPSくらいは出るように調整して今後進めていこうと思います。
(メモリも32GBにしたいね!)

【実際FPSはどれくらいでている?】

まず、まっさらなサードパーソンのスタンドアローンで丁度60FPSくらいです。
Lumenを切る場合80FPS以上くらいまで出ます。

そして、ゲームのエリア
【最適化前】
NaniteするべきものはONに、シェーダの複雑度等も問題ない状態ではありますが、
まさかの20~25FPSをウロウロ…場所によっては20を切ってしまうことも(泣)
ただ、PCスペックの問題もあるでしょうが最初のころはこんなFPSが下がることはなかったので、その後組んだBPとか、ナニカが悪さをして最近こんな下がってしまっているようだと考えました。

一体何が悪さをしているのか見つけたいけど分からない…そんな時に活躍するのがUnreal Insightとプロファイリングです!


【プロファイリングで重い処理を調べてみた】

Unreal Insightとプロファイリングのやり方に関しては公式ドキュメントの他、既にとても分かりやすく解説して頂いている方がいらっしゃるので参考記事を貼っておきます。

Unreal Japan Stream | UE4のプロファイリングと最適化のTips!Part 1
UE4向けですが最適化したい人は視聴必須です!

UE5でプロファイリングを行う~CPU編~
その他プロファイリングで検索すると参考になる記事や動画が沢山出てくるので詰んだ方はそちらに。

それでは早速見てみましょう。
(実際はまずUnreal Insightで大まかな原因を特定してからStart Profileをするのが良いのですが何故か今回Unreal Insightが動かなかったのでセッションフロントエンドで一から調べました。)

平均包括時間が45ms、FPSが30~20の間をウロチョロしているのが一目でわかります。
30FPSを出すには33.33ms、60FPSを出すには16.66ms以内に納めなければならないようです。60FPSには程遠いので30FPSを目指します。

まず、最初に見るべきはGame Threadでしょうか。この中身を見ると、Tick処理やBP Time、キャラクターの処理などを見ることが出来ます。(ちなみにWait For Eventとなっている所は問題ではないので無視して良いみたいです)
私の場合この中での重い処理は見つからなかったので毎回いじっているBPには問題がない…ではどこに!?

本当に見つかるのかな…と頭を痛くしながらゴリゴリ見ていくと…ん?

こいつやんけ!!
Build Navmeshと書いてあり、8msもこれにかかっています。
NavmeshとはNPCの行動範囲を制御するもので、フィールド上に手動で設定するものです。

それもそのはず、行動範囲の設定漏れがないように、一つのNavmesh bounds volumeで大きな建物をぐるっと囲うようにNavmeshを設定してしまっていて、それがとっても重かったみたいです…。なので行動してほしい床に、複数のvolumeを使って丁寧に設定し直すと…

なんと0.347msまで落ちました!よかった…
ただ、この段階でも包括時間は38msほど。まだ30FPSにはなりません。
この機会にレベルに配置したものを見直すことにしました。

【やはりライトニングは重い】

このレベルではLumenを使用し、更に暗い部分や光らせたい部分にポイントライトを置いていました。一旦、ポイントライトを全て消すと5FPSほど回復、さらにLumenを消すと10FPSほど回復しました。何とかしてLumenを使いながらFPSを回復できないか…と調べたことをまとめてみます。

まず、Lumenを使用すると室内部分がかなり暗くなってしまってそこにポイントライトを置いていましたが、5.1からはPostProsessのグローバルイルミネーション欄に「スカイライト漏れ」という項目があり、その数字をあげると室内の暗さが軽減されました。
その他Lumen周りで暗かったり明るかったりする際に見ると良い分かりやすい記事を見つけたのでこちらも参考にしてみてください。

環境アセット『Opera House Kit』を使ってライティングのコツをつかもう!

また、メッシュのカードをgroup IDで一つにまとめると軽量化につながるようなので試してみました。
「r.Lumen.Visualize.CardPlacement 1」とコマンド入力することでカードを可視化できます。

カードはメッシュごとに生成されますが、まとめたいメッシュをすべて選択後、
メッシュ詳細のレイトレーシング欄の
「Ray Tracing Group ID」の値を任意の数字にします。
あまりまとめすぎるとLumenが正しく生成されないよう
です。

これに関してはそこまでFPSの変動を感じられなかった
のですが、オープンワールドで大量のオブジェクトを
おいていたりする場合はまた効果があるかもしれません。

これで大体30FPSが保たれるくらいまできました。









【Lumenを使わない選択肢】

Lumenを使わないと奇麗な絵が出ないと思っていたのですが、工夫次第でそんなことないのかもと感じてきました。
更なるFPS改善の為、Lumenを使わずになるべく良く見せようとしてみた結果がこちらです。
 【Lumen使用】

【Lumen未使用】

未使用の方もなるべくライトは置かないように、6個だけにしています。
Lumenの方がもちろんリアルなライティングに見えますが、未使用の方は影と光のコントラストがかなり出ていてこれも悪くないかもと思えてきました。
未使用で特にいじった値は下記になります。
・SkylightのSky Distance Threshold
・DirectionalLightのIntensityとLight color
・ExponentialHeightFogの密度とフォールオフとColor
・PostProsessのカラーグレーディング全般

まずこの辺りをLumenをつけたり消したりしながら近づけるように値をもくもく調整していって、どうしても足りないところはポイントライトで補充するのが良いと思います。

Lumenは時と場合を考えて切ったりつけたりする使い方が一番かもしれません。

最終的にLumenも切った状態で包括時間25ms、FPSは40~50FPSまで回復するようになりました。


その他自分で作成したメッシュのポリゴン数とか、Niagaraとか、マテリアルとかまだまだ最適化できることは多く、旅は続きそうですが重い処理のライトニングについて一歩踏み出せたので新しいレベルデザインに取り掛かる際はこれらを踏まえたうえで行おうと思います。何か参考になれば幸いです。それではまた!

コメント