游戏是基于瓷砖的,但瓷砖实际上仅用于地形和寻路目的。Sprite 的移动是自由形式的(即,玩家可以穿过瓷砖的一半)。
这个游戏中的地图非常大。正常缩放时,图块为 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。这不是糟糕的内存管理吗?什么是更好的解决方案?