基于图块的RPG的最佳数据结构在java中

时间:2012-12-03 17:52:29

标签: java

游戏是基于图块的,但是图块实际上仅用于地形和路径查找。精灵运动是自由形式的(即,玩家可以在牌的中途)。

这个游戏中的地图非常大。在正常的缩放瓦片是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中时进行初始化似乎是一个糟糕的解决方案。如果一个生物在其他空白的瓷砖上移动,则需要不断地对列表进行初始化并将其设置为空。这不是糟糕的内存管理吗?什么是更好的解决方案?

1 个答案:

答案 0 :(得分:2)

  • 有一个包含所有的结构(以ArrayList开头) 你的精灵。
  • 如果您正在运行游戏循环并在精灵列表中骑自行车, 比如说,一次非常30-50秒,而且有200个精灵, 你不应该从这个结构本身受到影响。
  • 稍后,出于碰撞检测等其他目的,您可以 很需要修改一个ArrayList的结构。我会建议 从简单的,基本的解决方案开始,将您的游戏逻辑整理出来,然后根据需要进行优化。
  • 对于你的瓷砖,如果空间是一个问题,那么考虑包装,而不是有一个特殊的“瓷砖”对象 每个tile的信息为单个字节,short或int,如果不是 实际上每个瓷砖需要很多特定信息。记得 你创建的每个Java对象都有一些开销(为了这个目的) 参数,假设每个对象依次为24-32个字节 在VM和32与64位处理器上)。一个400万字节的数组 “仅”4MB,400万英镑“仅”16MB。
  • 如果将图块的规范打包到单个图元中,则另一种解决方案是将块格式化为一个大的ByteBuffer,每个图块的数据存储在索引(例如)tileNo * 16(如果每个图块需要16个字节)数据。
  • 您可以考虑不将所有磁贴存储在内存中。这是否合适取决于你的游戏。我会说2000x2000仍然在你可以明智地将整个数据保存在内存中的领域,如果每个单独的磁贴不需要太多数据。

如果你认为最后几个要点击败了面向对象语言的全部要点,那么是的,你是对的。因此,您需要权衡您选择“极端”解决方案以节省堆空间的时间点,或者您是否可以为了更好的编程范例而使用更多内存来“逃避”。每个图块具有一个对象可能使用(例如)几百兆字节的顺序。在某些环境中,这将是荒谬的。在其他几千兆字节可用的情况下,这可能是完全合理的。