お世話になっております。
負荷計測を行ったところ下記の箇所で負荷が高かったのですが、ここを軽減するにはどのような方法があるでしょうか?
Chaos::FPhysicsSolverBase::PullPhysicsStateForEachDirtyProxy_External<FPhysScene_Chaos::OnSyncBodies(Chaos::FPhysicsSolverBase*)::FDispatcher>(FPhysScene_Chaos::OnSyncBodies(Chaos::FPhysicsSolverBase*)::FDispatcher&)
何を見ていけば良いのか分からず、お手数ですが宜しくお願いします。
Unreal Insightsで statnamedeventsを有効にしてキャプチャを取るとSyncBody内のどの処理で負荷が発生してるか確認しやすいと思います。
(Process Single Particle Proxies, MoveComponnt, Process Geometry Collections Proxies などの処理が確認できると思います)
内訳がどうなっているか一度ご確認いただけますでしょうか。
一般的にはシーン中のスリープしていない剛体数に比例した負荷があり、動きがあった場合には、PrimitiveComponentへの姿勢の適用処理が走ります。
この際にオーバーラップイベントなどが有効になっていると指数的に負荷が高まることがあるのでご注意ください。
宜しくお願いします。
一旦本件をクローズさせていただきますが、キャプチャしたトレースデータに対して疑問などがございましたらお気軽に再オープンしてご質問いただけますと幸いです。
Unreal Insightsで確認したところ、
“FPhysScene_Chaos::OnSyncBodies-FJointConstraintPhysicsProxy”
に時間がかかっておりました。
この場合は、どのような点を確認してみるのが良いでしょうか?
お手数ですが、宜しくお願いします。
FPhysScene_Chaos::OnSyncBodiesにはSkeletalMeshに割り当てられたPhysicsAssetなどから作られたコンストレイントの数に比例して呼び出し回数が増加します。
stat ChaosCounters
などでコンストレイントの数が確認出来ますがこの数が想定内かどうか、まずご確認ください。必要の無いリッチなPhysicsAssetがあれば省略したり削除することも検討できると思います。
他には FPhysScene_Chaos::OnSyncBodies関数内のコールバックにおいて処理されているコンストレイントが破断する時に発火するbIsBreakingや制限値を超えたときに発火するbIsViolatingなどのイベントが連続して発火している可能性もありうります。
こちらは安定状態では発火しないためデバッガでブレイクを張っていただいて確認するのが簡単だと思います。