Nanite使用によりfpsが低下になることについて

お世話になっております。

Nanite使用の際のfpsが低下になることについてのご質問です。

下記の条件で実行して"stat unit"でパフォーマンスを確認しますと、”Frame”の処理時間が57ms前後、”Game”の処理時間が56ms前後になり、設定した”20fps”より低下になります。

UnrealInsightを確認しますと、”Rendering Frames”はNanite使用しない場合より30msほど長くなります。また、”Foreground Worker”に”Physics Ticks”の存在を確認できましたが、”Physics Ticks”は物理に関する処理と推察しますが、プロジェクトにおいて物理シミュレーションは明示的に有効にしていません。

ご質問:

①Naniteを有効にすることで物理処理が行われるのでしょうか?また、この処理時間を軽減することは可能でしょうか?

②Nanite使用の際に”Game”の処理時間が長くなる原因はなんでしょうか。ターゲットフレームレートをクリアするためのボトルネックを解消する方法を教えていただきたいです。

追記、ご参考:

下記の”再現手順”におきまして、BPアクターを表示される1700程のスタティックメッシュのみで作成してNaniteを有効にした際、”Game”の処理時間が26ms前後になり、FPSは20で安定になります。

再現手順
シーンの構成:メインキャラクタは15000程のNaniteがオンに設定されたスタティックメッシュで構成された一つのBPアクター、表示される際に、1700程のスタティックメッシュが表示され、以外のスタティックメッシュが非表示になります。背景はシンプルなスタティックメッシュで構成され、照明は一つのSkylightや10つのRectLightになります。

プロジェクト設定:Nanite On, Lumen On, Hardware raytracing On、細かい設定内容は添付画像にてご参考お願いします。

コマンド設定:t.MaxFPS 20、r.Nanite.MaxPixelPerEdge 0.1

お世話になっております。

>①Naniteを有効にすることで物理処理が行われるのでしょうか?また、この処理時間を軽減することは可能でしょうか?

Nanite を有効化することにより物理に関する処理が追加されるということは無いと認識しています。

後述のテストにおいてもそれらしい挙動は見つけられませんでした。

>②Nanite使用の際に”Game”の処理時間が長くなる原因はなんでしょうか。ターゲットフレームレートをクリアするためのボトルネックを解消する方法を教えていただきたいです。

手元でテストした限りでは Nanite/NoNanite で GameThread その他の処理時間が大きく変化することはありませんでした。

使用しているアセットやその他のロジックに依存するなど、Nanite の有効/無効以外にも条件があるのかもしれません。

症状を確認できる最小限のサンプルプロジェクトを共有していただくことは可能でしょうか。

尚、StaticMeshComponent の Collision 有効/無効により GameThread の負荷は大きく変化します(有効だと負荷が大きい)ので念の為確認されてはいかがでしょうか。

テスト内容は

・「基本」マップ上に StaticMeshComponent を 2025 個アタッチしたアクター(可動)を配置

・エディタ上で Play し stat fps / stat unit / UnrealInsights を確認

・Nanite 有効 / 無効 のメッシュを使用して同様のことを行う

といったものです。

よろしくお願いいたします。​

ご返答いただきありがとうございます。テストまで実施してくださり、大変感謝しております。

Naniteに関するテスト結果、承知いたしました。

使用しているアセットやその他のロジックに依存するなど、Nanite の有効/無効以外にも条件があるのかもしれません。

症状を確認できる最小限のサンプルプロジェクトを共有していただくことは可能でしょうか。

尚、StaticMeshComponent の Collision 有効/無効により GameThread の負荷は大きく変化します(有効だと負荷が大きい)ので念の為確認されてはいかがでしょうか。

→申し訳ございませんが、サンプルプロジェクトのご提供は難しいです。Collisionについてのテストを行い、他にアセットやロジックの依存についての確認もさせていただきます。

よろしくお願いいたします。

[Nikaido [Content removed] (EPS Partner)様

お世話になっております。

StaticMeshComponentのCollisionを無効にするには、

添付赤枠の設定が必要な認識ですがあっていますか?

他に設定すべき項目がございましたらご教示いただけますと幸いです。

[Image Removed]

また、UE4ではメッシュインポート時の設定で、

コリジョンの自動生成(Auto Generate Collision)があったかと思いますが、

UE5.6ではインポート時の設定に上記設定が見受けられません。

UEでコリジョンを有効にしたい場合は、他CGソフトで設定したコリジョンをインポート、

もしくはUEインポート後に有効化設定が必要という理解であっていますか?

以上、よろしくお願いいたします。

StaticMeshComponent にある コリジョンプリセット を NoCollision にするとコリジョンが無効化されます。

StaticMesh(アセット)にも同様の設定がありますが、StaticMeshComponent のものが優先されます。

[Image Removed]​

StaticMesh インポート時にはコリジョンを自動生成できます。

FallbackCollisionType にて形状の生成方法を指定できます。

こちらはコリジョンの形状に関するオプションであり 有効/無効 とは別である点にご注意下さい。

[Image Removed]​

よろしくお願いいたします。

[Nikaido [Content removed] (EPS Partner)様

お世話になっております。

ご返信ありがとうございます。

>こちらはコリジョンの形状に関するオプションであり 有効/無効 とは別である点にご注意下さい。

→上記、大枠の理解は添付であっていますでしょうか?

[Image Removed]

>→上記、大枠の理解は添付であっていますでしょうか?

はい。それで良いはずです。

お世話になっております。

Unreal Engineにおけるコリジョン設定と負荷の関係について教えていただきたいです。

形状をインポートする際に、”FallbackCollisionType”を”None”に設定してコリジョンを生成せず、その後”StaticMeshComponent”のコリジョンプリセットがデフォルト(BlockAll)の状態でアクターを配置した状態についての質問です。

コリジョンが生成されなくても、コリジョンが”有効”な状態になると認識していますが、この状態でGameThreadに負荷がかかる(Unreal Insight上で”Rending Frames”が約30ms長くなり、GameThreadに約30msのWaitForTasksが発生)といった可能性はあるのでしょうか。

実際に試してみましたが、メッシュにコリジョンが設定されていなかったとしてもコリジョン有効/無効で GameThread への負荷が異なりました。

コリジョンを使用しない場合にはメッシュのコリジョン有無に関わらず無効化をしておくのが良さそうです。