短縮版
オブジェクトがオンザフライで生成される大きく開いたマップで衝突を検出するパフォーマンスに優しい方法は何ですか?
ロングバージョン
現在、これまでに作成した最初のAndroidゲームの再作成に取り組んでいます(https://play.google.com/store/apps/details?id=com.Joey_Ant.Lite&feature=search_result#?t=W251bGwsMSwyLDEsImNvbS5Kb2V5X0FudC5MaXRlIl0。)
私はそれをゼロから再構築し、約100の新機能を追加しています。
ゲームの説明:ユーザーは、地下のグリッドベースのマップと地上のオープンプレイフィールドを持つアリのコロニーを制御できます。アリはAIを持ち、アリがたくさんいる可能性があります。(つまり、すべてのがらくたを最適化する必要があります。)マップは非常に可変的です。(マップクリエーターを作成し、ユーザーがオンラインでマップを作成およびダウンロードできるようにする予定です。)
それで、多数のオブジェクトと他のアリ/生き物でいっぱいの地図で、衝突を検出するための最適な方法は何ですか?衝突を検出するために他のすべてのオブジェクトをループすることはできません。これは、クリーチャーごとに発生する必要があり、CPU時間を浪費するためです。
私が考えたこと
グリッド:任意のグリッドオブジェクトを作成します。グリッドオブジェクトはサブリージョン(実際のグリッド)を作成し、クリーチャーが「考える」たびに作成します。グリッドオブジェクトをそれ自体への参照で更新します。次に、クリーチャーはグリッドオブジェクトにそのグリッド内の他のオブジェクトを要求します。これにより、実行する必要のあるチェックの数が大幅に削減されることを願っています。ただし、このためのオーバーヘッドはさらに大きくなる可能性があります。このグリッドは、AIの決定がそのエリア内の他のオブジェクトやクリーチャーによって影響を受けるため、クリーチャーがその一般的なエリア内の他のクリーチャーを検出できるようにするためにも役立つ場合があります。
占有グリッド:基本的に上記のグリッドオプションと同じですが、グリッドオブジェクトのみがオブジェクトによって作成されます。3つのオブジェクト(A、B、C)があるとします。オブジェクトAを初期化すると、指定された幅と高さのグリッドセルが作成されます。オブジェクトBは初期化されていますが、オブジェクトAと同じ領域にあるため、そのグリッド領域に追加されます。オブジェクトCはエリア外で初期化されるため、その場所のグリッドセルを作成します。オブジェクトCがオブジェクトAが入っているセルに入ると、その前のセルは破棄されます。これは泡が吹いているように想像できると思います。
これを行うためのより良い方法のアイデアはありますか?