CCD有効なコリジョンが高速に移動した場合のメモリ確保について

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

CCD有効なコリジョンが高速に移動した場合にメモリが大量に確保されるということがあり、そちらに関しては対処出来たのですが

その後スリープせず地面に転がっているなどの状態で高速での移動は行っていない場合においても増加したメモリが解放されず残る可能性があるのでしょうか?

<br/>

対処する前のWinパッケージに関して、CCD有効なコリジョンが高速に移動した場合のメモリ大量確保時に仮想メモリが増加してその後しばらく解放されずで、物理メモリも若干増えたままになっているのを確認しました。

何かしら確保されたままになるような可能性はあるのでしょうか?

<br/>

[Attachment Removed]

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

記載頂いた内容については、Chaosの実装が「要素数は毎フレーム減らすが、確保済みの容量やオブジェクトプールのブロックはピークを維持する」という方針で設計されていることにより想定される事象です。CCDのSweap処理自体は速度が落ちれば止まりますが、TArrayのResetやプールからのFreeは確保したヒープをOSに返す処理ではありません。また、Sleep中の接触ペアは意図的に残されるため、見かけ上は低速または停止中でも、プロセス内に残っているコミット/仮想メモリは高いままになる(ご記載頂いた「仮想メモリが大きく増えたあと、しばらく解放されず、物理メモリも若干高いまま」)という挙動は起こり得ます。

​​

対処方針としては、大きく2つです。

1つ目はメモリ確保量そのものを抑えることです。CCDを常時有効にせず、高速移動中だけ有効化して着地・減速後に無効化(SetUseCCD(false))する、CCD対象ボディを必要最小限に絞る、不要な衝突相手をチャンネル設定で減らす、といった事は有効です。加えて、AABB膨張を抑制するために p.Chaos.Collision.CCD.UseTightBoundingBox=1を維持する、二次衝突処理を抑えるため p.Chaos.Collision.CCD.ConstraintMaxProcessCount=1とするなど調整することも有効です。

2つ目はピーク後にメモリを明示的に返すエンジン側の対応です。現行はCCD非アクティブ時に作業配列をEmptyする、ConstraintのObjectPoolをShrinkTo する、といったメモリをShrinkする仕組みはほぼありません。したがって「転がっているうちに自然に戻る」ことは期待しづらく、残留を減らしたい場合は、一定フレーム CCD が動いていないときに容量をShrinkするような改修が必要になります。ただしこちらはサポート外となる点や現行の挙動から変わる可能性がある点も踏まえると、1つ目の方法の方が良いかと思われます。

[Attachment Removed]

ありがとうございます。

調査しつつ対策を試してみます。

[Attachment Removed]