1.5Gbに達するとアプリがクラッシュします。
これは、各タイルのサイズが〜80バイトであることを意味するため、タイルを正しく表現していないことを強く示唆しています。
理解する必要があるのは、タイルのゲームプレイの概念とユーザーに表示される視覚的なタイルの間に分離が必要であるということです。これら2つの概念は同じものではありません。
テラリアを例にとってみましょう。最小のTerrariaの世界は、4200x1200タイル(500万タイル)を占めます。さて、その世界を表すのにどれだけのメモリが必要ですか?
さて、各タイルには、前景レイヤー、背景レイヤー(背景の壁)、ワイヤーが行く「ワイヤーレイヤー」、家具アイテムが行く「家具レイヤー」があります。各タイルはどのくらいのメモリを使用しますか?繰り返しますが、私たちは視覚的にではなく、概念的に話しているだけです。
前景のタイルは、符号なしのshortに簡単に格納できます。前景タイルのタイプは65536を超えないため、これより多くのメモリを使用しても意味がありません。背景タイルの種類は256種類に満たないため、背景タイルは簡単に符号なしバイトになる可能性があります。ワイヤーレイヤーは純粋にバイナリです。タイルにはワイヤーが含まれるか、含まれません。つまり、タイルごとに1ビットです。そして、家具の層は、家具の可能な異なる部分の数に応じて、符号なしバイトになる可能性があります。
タイルごとの合計メモリサイズ:2バイト+ 1バイト+ 1ビット+ 1バイト:4バイト+ 1ビット。したがって、小さなTerrariaマップの合計サイズは20790000バイト、つまり最大20MBです。(注:これらの計算はTerraria 1.1に基づいています。それ以降、ゲームは大幅に拡張されましたが、最新のTerrariaでもタイルの場所ごとに8バイト、または〜40MBに収まる可能性があります。それでもかなり許容範囲です)。
この表現をC#クラスの配列として保存しないでください。それらは整数の配列またはそれに似たものでなければなりません。C#構造体も機能します。
次に、マップの一部を描画するとき(強調点に注意)、Terrariaはこれらの概念的なタイルを実際のタイルに変換する必要があります。各タイルは、前景画像、背景画像、オプションの家具画像を実際に選択し、ワイヤー画像を持っている必要があります。XNAには、さまざまなスプライトシートなどが付属しています。
概念マップの表示部分を実際のXNAスプライトシートタイルに変換する必要があります。一度にすべてを変換しようとするべきではありません。保存する各タイルは、「IはタイルタイプXです」というインデックスでなければなりません。Xは整数です。その整数インデックスを使用して、表示に使用するスプライトをフェッチします。また、XNAのスプライトシートを使用して、個々のクワッドを描画するだけでなく、これを高速化します。
次に、タイルが表示される領域をさまざまなチャンクに分割する必要があります。これにより、カメラが動いたときに常にスプライトシートを作成する必要がなくなります。そのため、64x64のチャンクをスプライトシートとして使用できます。プレーヤーの現在のカメラ位置から見える64x64の世界のチャンクが、描画するチャンクです。他のチャンクにはスプライトシートさえありません。チャンクが画面から落ちた場合は、そのシートを破棄します(注:実際に削除するのではなく、そのままにして、後で表示される可能性がある新しいチャンクに再指定します)。
少なくともサーバーアプリ(および可能であればクライアント)でマップ全体を処理してもらいたいのですが。
お使いのサーバが知っているか、タイルの視覚的な表現を気にする必要はありません。気にする必要があるのは、概念的な表現だけです。ユーザーがここにタイルを追加すると、そのタイルインデックスが変更されます。