gpt4 book ai didi

java - Java 中基于图 block 的 RPG 的最佳数据结构

转载 作者:行者123 更新时间:2023-12-02 07:24:46 25 4
gpt4 key购买 nike

游戏是基于图 block 的,但图 block 实际上仅用于地形和寻路目的。 Sprite 的移动是自由形式的(即,玩家可以穿过图 block 的一半)。

这个游戏的 map 非常大。正常缩放图 block 为 32*32 像素, map 尺寸可达 2000x2000 或更大(400 万个图 block !)。目前, map 是瓦片数组,瓦片对象如下所示:

public class Tile {

public byte groundType;
public byte featureType;
public ArrayList<Sprite> entities;

public Tile () {
groundType = -1;
featureType = -1;
entities = null;
}
}

其中groundType是纹理,featureType是占据整个图 block (例如树或大岩石)的 map 对象。这些类型的功能非常常见,因此我选择将它们作为自己的变量,而不是将它们存储在实体中,实体是图 block 上的对象列表(元素、生物等)。出于性能原因,实体被保存到图 block 中。

我遇到的问题是,如果实体未初始化为 null,Java 就会耗尽堆空间。但是将其设置为 null 并且仅在某些内容移入图 block 时才进行初始化在我看来是一个糟糕的解决方案。如果一个生物在空的方 block 上移动,则列表将不断需要初始化并设置回空。这不是内存管理不好吗?什么是更好的解决方案?

最佳答案

  • 有一个包含所有内容的结构(以 ArrayList 开头)你的 Sprite 。
  • 如果您正在运行游戏循环并循环浏览 Sprite 列表,比如说,每 30-50 秒一次,最多有 200 个 Sprite ,这种结构本身不应该影响性能。
  • 稍后,出于其他目的(例如碰撞检测),您可以我们只需要修改单个ArrayList的结构。我会建议从简单、古怪的解决方案开始,整理你的游戏逻辑,然后根据需要进行优化。
  • 对于您的图 block ,如果空间是一个问题,那么与其使用特殊的“图 block ”对象,不如考虑打包每个图 block 的信息转换为单个字节,短字节或整数(如果不是)实际上每个图 block 需要很多具体信息。记住您创建的每个 Java 对象都有一些开销(为了参数,假设每个对象的顺序为 24-32 字节,具体取决于在 VM 和 32 与 64 位处理器上)。 400万字节的数组是“仅”4MB,400 万个整数“仅”16MB。
  • 如果将图 block 的规范打包到单个基元中不切实际,则图 block 数据的另一个解决方案是声明一个大的 ByteBuffer,每个图 block 的数据存储在索引(例如)tileNo * 16(如果每个图 block 需要 16 个字节)处数据。
  • 您可以考虑实际上并不将所有图 block 存储在内存中。这是否合适取决于您的游戏。我想说,如果每个单独的图 block 不需要太多数据,2000x2000 仍然在您可以明智地将整个数据保留在内存中的范围内。

如果您认为最后几点打败了面向对象语言的全部要点,那么是的,您是对的。因此,您需要权衡在什么时候选择“极端”解决方案来节省堆空间,或者是否可以“摆脱”使用更多内存以获得更好的编程范例。每个图 block 有一个对象可能会使用(比如说)几百兆字节的数量级。在某些环境下这会很荒谬。在其他有几千兆字节可用的情况下,这可能是完全合理的。

关于java - Java 中基于图 block 的 RPG 的最佳数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13688927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com