2012-03-15 14 views
2

私は2次元、タイルベースの(直交タイル)iPhoneゲームをコーディングしています。すべてのレベルは、アプリの最初の再生時に手続き的に生成され、ユーザーが新しいマップを必要とするまで維持されます。地図はかなり大きく、幅と高さが1000タイルで、地形は破壊的です。現時点ではTerrariaと似ていますが、それは変更されます。大きなランタイム生成タイルマップを効率的に処理するには?

マップ/タイル情報を保持するために、私は現在いくつかの2次元Cスタイルの配列を使用しています。これはうまくいきますが、配列のすべてがshort array[1000][1000]と定義されているため、これが費やすメモリの量が懸念されます。これはスペースの1000 * 1000 *(短い)バイトを占有します。

特に、ユーザーがマルチタスキングをしているときに、iPhoneには非常に大量のメモリが搭載されていないときは、これはあまり望ましくありません。主な問題は、すべてのレベルが手続き的に生成されるため、.tmxなどの特定のタイルマップ形式を使用できる方法がないことです。タイルがindex(x、y)で破棄された場合、そのインデックスのデータを変更する必要があるため、パフォーマンスも問題になる可能性があります。タイルマップデータをテキストファイルに書き込むことも考えましたが、データにアクセスしたり変更したりするときに問題やパフォーマンスの問題が発生すると思います。

タイルデータを効率的かつ迅速に処理するにはどうすればよいでしょうか?

+2

手続き型で生成されたものであれば、必要なときにタイル値を生成するのはなぜですか? –

+0

それは良い点です。主にプロセスのためです。私のマップはタイルのいくつかを配置する[drunkard walk](http://pcg.wikidot.com/pcg-algorithm:drunkard-walk)メソッドを使用しています。私は、プロセスの性質上、一度にすべてを除いて、これをどうやってやるのか分かりません。 –

答えて

1

これは、各タイル要素が周囲のタイルとの関係を持つように構造化されたコアデータです。ここには軽度のオーバーヘッドはありませんが、画面上にないタイルをメモリから解放し、必要なときにそれらを戻すことができるという利点があります。ある方向に移動すると、その方向のタイルを照会することができ、バックグラウンドにいるときにメモリをかなり安価にダンプすることができます。これにより、「複数の」2D配列が取り除かれ、すべてのデータが単一のオブジェクトに移動されます。原理的には、すべてが座標ではなく関係であるため、グリッドはこのようにサイズが無限になる可能性があります。

同様に、SQLiteを使用して問題に近づき、与えられた範囲内の行と列を照会することができます。オブジェクトをNSDiscardableContentとマークしてNSCacheに入れると、メモリのパフォーマンスが大幅に向上する可能性があります。座標を正と負の両方にできる限り、効果的に無限のグリッドを生成できます。

+0

これは有望ですね!私は何年も何年もプログラミングをしていないことを考慮して、どちらが良いと思いますか? (必要に応じて実装して拡張する方が簡単でしょう) –

+0

特にCoreiteの方は、SQLiteに精通していない人がいれば、おそらくCore Dataに頼るでしょう。 –

+0

私はCore Dataを調べましたが、有望そうです。私にそれを指摘してくれてありがとう!私はこれを私の答えとしている。 –

関連する問題