gpt4 book ai didi

java - LWJGL 中的平铺引擎

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

我正在重写一个我一直在用LWJGL开发的游戏(原始引擎是纯java的),我想知道将 map 渲染到屏幕上的最有效的方法。我将制作一个平铺 map ,并为可行走的图 block 、碰撞图 block 和静止物体各设置一个图层。我将通过解析 XML 文件将所有内容读入游戏。

我的问题是我应该这样做,并将每个图 block 单独读取到游戏中并将值存储到二维数组中,将它们分配给 Sprite 并将每个 Sprite 渲染到屏幕上各自的位置吗?或者将这些图层设为自己的单个图片文件并渲染图层而不是图 block ,对 CPU/GPU 的负担会更少吗?我认为第二个会更让人痛苦,但是值得吗?

最佳答案

最好将瓷砖组合在一起形成一个大的纹理图集。假设您使用 32x32 像素图 block ,则 2k 纹理最多可以容纳 4096 个不同的图 block ,对于游戏来说可能绰绰有余。原因是您可以绑定(bind)此纹理一次并用它进行(几乎)所有渲染,从而避免昂贵的纹理切换操作。不要为每个图 block 使用单独的图片。所有纹理和其他渲染资源都应预先上传,最好是在游戏加载或关卡加载时上传。

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

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

如果操作正确,您可能只需要几次绘制调用即可渲染世界,并且仍然能够绘制大量图 block 。显然,这仅适用于静态对象,您需要以不同的方式绘制动态对象。请记住,绘制调用可能会进行上下文切换,代价高昂,应尽可能避免。

关于java - LWJGL 中的平铺引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28687323/

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