1

几个月来,我一直在尝试各种方法来创建基于图块的二维游戏。我一直让每个瓦片成为“瓦片”类的单独对象。瓦片对象存储在对象的二维数组中。这已被证明是非常不切实际的,主要是在同时渲染许多图块的性能方面。我通过只允许渲染玩家一定距离内的瓷砖来帮助实现这一点,但这也不是那么好。当我尝试在游戏中编辑磁贴的值时,我也遇到了对象返回空指针异常的问题。这与 2D 数组中的对象未正确初始化有关。

还有其他更简单的方法吗?我无法想象每个基于图块的游戏都使用这种确切的方式,我一定忽略了一些东西。

编辑:也许 LWJGL 不是要使用的正确库?我在使用 LWJGL 实现字体系统时遇到了类似的问题……输入超过一个句子会使 FPS 降低 100 甚至更多。

4

2 回答 2

2

对于静态对象(不去任何地方,留在原地)1 tile = 1 object 是可以的。这就是在 Wolf3d 中完成的方式。对于移动对象,您有多种选择。

如果您真的想要,您可以将对象子部分存储在相邻的单元格/图块中,当一个对象没有完全包含在其中一个中并且跨越一个或多个单元格/图块边界时。但这可能不太方便,因为您需要动态地将对象拆分为多个部分。

更合理的方法是根本不将移动对象存储在单元格/图块中,并或多或少独立于静态对象来处理它们。但是随后您将需要一些代码来确定对象的可见性。实际上,在图形中最基本的性能问题来自于不必要的计算和渲染。通常,您甚至不想尝试渲染不可见的内容。同样,如果某些计算(尤其是复杂的计算)可以移到最内层循环之外,它们应该是。

除此之外,很难给出任何具体的建议,因为关于你在做什么、你是如何做的以及查看实际代码的细节如此之少。你真的应该试着把你的问题具体化。

于 2012-07-09T09:06:58.450 回答
1

Tile 对象的二维数组应该没问题........这是大多数 2D 游戏使用的,您当然应该能够从 OpenGL / LWJGL 中获得足够好的性能来以良好的速度渲染它( 100FPS+)。

检查事项:

  • 确保您正在剪辑以仅显示可见的图块集(根据屏幕宽度和高度以及播放器的位置)
  • 确保绘制每个图块的代码快速......理想情况下,您应该为每个图块只绘制一个带纹理的正方形。特别是,您不应该在渲染代码中针对每个图块执行任何复杂的操作。
  • 如果你很聪明,你可以在一个 OpenGL 调用中使用 VBO 绘制多个图块/巧妙地使用纹理坐标等。但这对于基于图块的游戏来说可能是不必要的。
于 2012-07-09T15:10:24.713 回答