私はAndroid用ゲームを作っています。私はゲームを秘密に保つように努力しているので、あまりにも多くを明らかにすることはできないので、私にも負担してください。基本的にはリアルタイムで実行されるので(オブジェクトの座標を更新するスレッドを実装します)、そのスタイルはDuck Huntのようなものです。しかし、あなたは画面上を移動するオブジェクトを叩く必要があります。しかし、ゲームは時々(時にはハイエンドデバイスの1つであるSamsung Galaxy Sで実行される)わずかに遅れています。より良いデータ構造。Androidゲーム開発:どのデータ構造を使用するのですか?
基本的には、画面上のオブジェクトの最大数を動的にしたいので、配列の代わりにこれらのオブジェクトを二重リンクリストに格納しています。言い換えれば、頭と尾のオブジェクトへの参照があり、すべてのゲームオブジェクトは、典型的なリンクリストのように接続されています。これは、次のような問題を提供します。私は尾部に頭部から横断し、確認する必要があるので、オブジェクトが所与の(画面をタッチすることにより)座標と交差する場合に検索
- はO(N)時間(最悪の場合)を取り各オブジェクトのヒットボックス。
- すべてのオブジェクトに対して、そのヒットボックスがリンクリスト内の他のすべてのオブジェクトと交差しているかどうかをチェックする必要があるため、2つのオブジェクト間の衝突チェックにはO(n^2)時間がかかります。
リンクされたリストを選択したもう一つの理由は、基本的に2つのリンクされたリスト(アクティブなオブジェクト(つまり、画面上のオブジェクト)と非アクティブオブジェクト)です。つまり、ゲーム画面に最大8つのオブジェクトが存在するとします。アクティブなリンクリストに5つのオブジェクトがある場合、非アクティブなリストには3つのオブジェクトがあります。 2つのリンクされたリストを使用すると、オブジェクトが非アクティブになるたびに、逆参照したり、ガベージコレクタがメモリを再利用するのを待つのではなく、リンクされていないリストにオブジェクトを追加することができます。また、新しいオブジェクトが必要な場合は、新しいオブジェクトを作成するためにメモリを割り当てなくても、リンクされていないリストからオブジェクトを取り出し、アクティブなリンクリストで使用することができます。
多次元配列の使用を検討しました。この方法では、画面をオブジェクトが存在する「セル」に分割します。たとえば、480x800の画面で、オブジェクトの高さと幅がともに80ピクセルの場合は、画面を6x10グリッドに分割するか、JavaコードのコンテキストでGameObject [6] [10]を作成します。オブジェクトの座標(画面上の座標)を80で割って(グリッド上で)そのインデックスを取得することもでき、O(1)の挿入も可能です。これは、タッチ座標で同じことを実行して適切なインデックスを確認できるので、座標O(1)で検索することもできます。
グリッド内のすべてのセルを調べなければならないため、衝突チェックにO(n^2)時間かかる場合があります(この方法では、セルに隣接する最大8個のセルと比較するだけです)。現在検討中)。
しかし、グリッドのアイデアは、独自の問題を提起:画面は480X800以外の解像度を持つ
- 場合はどうすれば?また、グリッドを6x10に均等に分割できない場合はどうなりますか?これにより、プログラムのエラーが発生しやすくなります。
- メモリの点でゲームオブジェクトのグリッドを使用していますか?私がモバイルデバイス用に開発していることを考慮すると、これを考慮する必要があります。
したがって、究極の質問は、私がリンクリスト、多次元配列、または私が考慮していない何かを使うべきかどうかです。優れた衝突検出性能のため
private void checkForAllCollisions() {
GameObject obj1 = mHead;
while (obj1 != null) {
GameObject obj2 = obj1.getNext();
while (obj2 != null) {
//getHitBox() returns a Rect object that encompasses the object
Rect.intersects(obj1.getHitBox(), obj2.getHitBox());
//Some collision logic
}
obj1 = obj1.getNext();
}
}
メモリに関しては、新しいメモリの割り当てと、ガベージコレクションのメモリの再利用が心配です。そのため、アプリに異常が発生します。また、私はあまりJavaのListクラスに精通していませんが、ドキュメントを見てから、それは通常の配列とどう違うのですか? – Dan
GCのかゆみが見えるときは、そのことについて心配してください。 ['List'](http://download.oracle.com/javase/6/docs/api/java/util/List.html)はインタフェースです。 'LinkedList'と' ArrayList'はそのインターフェースの異なる実装です。既に[** [公式文書](http://download.oracle.com/javase/tutorial/collections/implementations/list.html)**と** [その他の質問]( http://stackoverflow.com/search?q=%5Bjava%5D+linkedlist+vs+arraylist)**)の違いについて。 'ArrayList'は、一般的には、目的の汎用的な' List'実装とみなされます。 –
^私はこれをもう一度。可能であれば、LinkedListにArrayListを貼り付けてください。 – Vinay