ゲームはタイルベースですが、タイルは実際には地形とパスファインディングの目的でのみ使用されます。スプライトの動きは自由形式です(つまり、プレイヤーはタイルの途中にいることができます)。
このゲームのマップは非常に大きいです。通常のズームタイルは32*32ピクセルで、マップサイズは2000x2000以上(400万タイル!)になる可能性があります。現在、マップはタイルの配列であり、タイルオブジェクトは次のようになります。
public class Tile {
public byte groundType;
public byte featureType;
public ArrayList<Sprite> entities;
public Tile () {
groundType = -1;
featureType = -1;
entities = null;
}
}
ここで、groundTypeはテクスチャであり、featureTypeはタイル全体(木や大きな岩など)を占めるマップオブジェクトです。これらのタイプの機能は非常に一般的であるため、タイル上のオブジェクト(アイテム、クリーチャーなど)のリストであるエンティティに格納するのではなく、独自の変数にすることを選択しました。エンティティは、パフォーマンス上の理由からタイルに保存されます。
私が抱えている問題は、エンティティがnullに初期化されていない場合、Javaのヒープスペースが不足することです。しかし、それをnullに設定し、何かがタイルに移動したときにのみ初期化することは、私には悪い解決策のように思えます。クリーチャーが空のタイルを横切って移動している場合、リストは常に初期化され、nullに戻される必要があります。これは貧弱なメモリ管理ではありませんか?より良い解決策は何でしょうか?