LWJGL中的平铺引擎

时间:2015-02-24 02:43:25

标签: java opengl sprite lwjgl tiles

我正在重写我一直在使用LWJGL(原始引擎是纯java)的游戏,我想知道最有效的渲染地图的方法到屏幕。我将制作一个Tiled地图,并为可行走的瓷砖,碰撞瓷砖和静止物体分别设置一层。我将通过解析XML文件来阅读所有这些内容。

我的问题是我应该这样做,并将每个磁贴单独读入游戏并将值存储到二维数组中,将它们分配给精灵并将每个精灵渲染到屏幕上各自的位置?或者在CPU / GPU上减少使这些图层成为自己的单个图片文件并渲染图层而不是图块?我认为第二个会更加痛苦,但值得吗?

1 个答案:

答案 0 :(得分:2)

最好将瓷砖组合在一起,形成一个大的纹理图集。假设您使用32x32像素图块,2k纹理可以容纳多达4096个不同的图块,可能对游戏来说已经足够了。原因是你可以绑定这个纹理一次并且(几乎)用它进行所有渲染,避免了昂贵的纹理切换操作。不要为每个图块使用单独的图片。所有纹理和其他渲染资源都应该预先上传,最好是在游戏负载或级别负载下。

对于实际的图块和对象,您应该构建一个包含所有对象的顶点属性的顶点缓冲区,并在级别加载期间上传它。这个缓冲区将包含顶点位置,颜色,纹理坐标......绘制图块所需的一切,如果还不够,可以将其拆分为多个缓冲区。对于每个帧,您使用相机坐标来找出哪些图块是可见的以及哪些图块不可见,然后发出绘图调用,其中包含第一个可见图块的起始索引和可见图块的计数。简单的AABB检查在这里非常好。当然,为了实现这一点,你的顶点缓冲区必须以这样一种方式布局,即只能在一个方向上进行布局,例如:从左到右,从上到下。

或者,您可以花费更多的积极顶点计数修剪,但需要花费更多的绘制调用:将世界分割成块,使每个块大到足以覆盖整个屏幕。如上所述为每个块创建顶点缓冲区。然后进行相同的相机检查以找出哪个块可见并绘制它们。在这种情况下,您至少可以看到1个块,并且在任何给定时间最多可以看到4个块,这意味着1到4个绘制调用。这种方法比之前的方法更有优势,因为您可以循环遍历块,而不是必须遍历每个块,这意味着需要更少的检查。

如果操作正确,您可能不会需要多次绘制调用来渲染世界,并且仍然可以绘制大量的图块。显然,这仅适用于静态对象,您需要以不同方式绘制动态对象。请记住,绘制调用可以使上下文切换变得昂贵,并且应尽可能避免。