游戏是基于图块的,但是图块实际上仅用于地形和路径查找。精灵运动是自由形式的(即,玩家可以在牌的中途)。
这个游戏中的地图非常大。在正常的缩放瓦片是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并且仅在某些东西移动到tile中时进行初始化似乎是一个糟糕的解决方案。如果一个生物在其他空白的瓷砖上移动,则需要不断地对列表进行初始化并将其设置为空。这不是糟糕的内存管理吗?什么是更好的解决方案?
答案 0 :(得分:2)
如果你认为最后几个要点击败了面向对象语言的全部要点,那么是的,你是对的。因此,您需要权衡您选择“极端”解决方案以节省堆空间的时间点,或者您是否可以为了更好的编程范例而使用更多内存来“逃避”。每个图块具有一个对象可能使用(例如)几百兆字节的顺序。在某些环境中,这将是荒谬的。在其他几千兆字节可用的情况下,这可能是完全合理的。