Chaos::FAABBTree の割当を削減したい

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

<br/>

◆前提

ゲームのとあるシーンをMemoryInsightsでプロファイルしたところ、「Chaos::FAABBTree」の割当が多く実行されていることがわかりました。

[Image Removed]

こちら、メモリ使用量の増加につながっているようなので、なるべく減らしたいと思っています。

<br/>

<br/>

◆質問

  1. Chaos::FAABBTreeは物理シミュレーションで使う構造体で間違いないでしょうか?
  2. Chaos::FAABBTreeの割当を削減する方法はありますか?
    1. メッシュのコリジョンを削除する
    2. コリジョンのプリセットを調整する
    3. その他、方法があればご教授いただけると助かります

<br/>

以上です。ご確認よろしくお願いいたします。

(下記のリンク先は、本スレッドを英語に翻訳した英文スレッドですが、Epic Games のサポートチームが内部的に使用するものですので、ユーザーの方に利用していただく必要はございません。サポートは、この日本語スレッドに日本語で表示されることになります。)

[How to reduce the memory allocation for [Content removed]

(以下は、サポート担当の Stacey Geoff によるコメントを翻訳したものです。)

お世話になっております。ご質問ありがとうございます。

> Chaos::FAABBTreeは物理シミュレーションで使う構造体で間違いないでしょうか?

1) おっしゃるとおり、AABBTree は物理シミュレーションの構造体です。これは、物理のより高コストな処理を行う前に、コリジョンしないオブジェクトのペアをできるだけ多く素早く除外するために使われるものです。また、Unreal Engine が通常使われる状況において、2 つの使われかたがあります。1 つはゲームスレッド上で、シーンのクエリに使用されます。もう 1 つは物理スレッド上で、コリジョンに使用されます。

> Chaos::FAABBTreeの割当を削減する方法はありますか?

2) このメモリ使用量を削減するためには、一般的には、以下のような方法があります。

• 可能な場合はインスタンス化する(例: 同じアセットを多く複製する場合は Instanced Static Mesh を利用する)。

• 可能であればプリミティブ (例: 球体、立方体など) を使用する。(負荷が減り速度も速くなります。ただし、精度は低くなります。)

• メッシュの複雑性を落とす。(複雑性が上がるのは、クライアントで Nanite が使われる場合と、高密度のメッシュがあまり簡素化されずに使用される場合です。)

• 大規模なワールドの場合は hydration (ハイドレーション) を利用する。それによって、必要ない場合にアクタ (物理演算も含む) の読み込みを回避できます。

Light Weight Instances UE5 | Community tutorial

• ジオメトリ コレクションが使われている場合、その簡素化を行う。

(以下はすべて GeometryCollectionPhysicsProxy.cpp 内に CVars として保存されています) ― bBuildGeometryForChildrenOnPT/GT、bCreateGTParticleForChildren ― これらは、オブジェクトが破壊される際に、小さな「壊れた」ボディに対してのみ物理を計算するため、メモリを節約できる可能性があります。

• オーバーラップしている葉をキャッシュしないようにする。(これによりシーンクエリのコストがかかりますが、メモリ使用量は削減できます。)

(以下は PBDRigidsEvolution.cpp 内で CVars として保存されています) ― GAccelerationStructureCacheOverlappingLeaves ― シーンクエリの速度は大いに向上しますが、メモリ負荷が生じる可能性があります。

• 物理やシーンクエリに必要のない物理ジオメトリをすべて削除する。

以上が主な対策だと思います。コリジョンのプリセットは、メモリにはあまり影響しません。主に実行時のパフォーマンスを向上させるためのものです。

(以下は他ライセンシーの Selifonov Eugene による Stacey Geoff に対するコメントを翻訳したものです。)

> コリジョンのプリセットは、メモリにはあまり影響しません。

とのことですが、プリセットが NoCollision に設定された場合はどうなりますか? この場合、物理はメモリを消費しますか?

ご回答ありがとうございます。

いただいた対策案をプロジェクトに適用できないか検討してみます。

[mention removed] 様

本件、一応の回答がなされたたようですので、記録上一旦クローズとさせていただきますが、本件問題に関連して他にも問題/疑問等が生じた場合には、引き続き、このスレッドをご利用いただくことができます (ご投稿していただくだけで、自動的にオープンとなります) 。その際は、どうぞ遠慮なくご質問ください。今後もよろしくお願いいたします。

(以下は、サポート担当の Stacey Geoff による Selifonov Eugene に対するコメントを翻訳したものです。)

その場合は、ジオメトリは引き続きロードされているままですが、何ともコリジョンしなくなります。このような機能のユースケースは、より一時的なもの、または、一過性のものです。すべてのチャンネルが無効になったときにアンロードされるとなると、データのロード/アンロード時にパフォーマンスに負荷がかかるはずです。