我正在使用LWJGL制作游戏,到目前为止我决定使用5或6张精灵表。它就像一个块,一个用于项目,对象等。通过这样做,我有精灵表与精灵紧密相关,并且通常具有相同的大小(在块和项目的情况下)。但这是更好的方法吗?或者我应该把所有东西扔在一张精灵表上,没有任何组织?
如果我以正确的方式这样做,还有另一个问题。例如,当你在地图中时,我需要绘制块。但是在块上,可能存在电线和其他东西 - 这些都是分开的精灵表。但是,此信息存储在同一阵列中。所以通常我只迭代它一次,然后每次绘制块,然后在它上面连线 - 每次迭代切换精灵表两次。但我认为切换它们可能需要一些时间,所以也许更有意思的是运行两次,首先绘制所有块,然后再次迭代以绘制线?要更改纹理,我使用的是SlickUtil Texture类,它有一个绑定方法 - 非常容易使用。
答案 0 :(得分:1)
没有“理想”;只有符合您需求的因素。
记住你完全使用精灵表的原因:因为在处理2D渲染时,切换纹理对于每个对象来说太昂贵了。因此,只要你没有为你渲染的每个精灵切换纹理,你就已经在性能方面领先于游戏。
您需要考虑的其他因素包括:
最低用户硬件规格。具体来说,您希望代码处理的GL_MAX_TEXTURE_SIZE
的最小大小是多少?精灵表越大,硬件要求就越高,因为单个精灵表必须是纹理。
此值取决于硬件,但有一些一般要求。 OpenGL 3.3至少需要1024个;几乎每一块GL 3.3硬件都提供4096.OpenGL 4.3需要一个巨大的16384,它接近浮点纹理坐标容量的理论极限(假设你想要至少8位子像素纹理坐标精度)。
GL 2.1的最低要求为64,但任何实际的 2.1硬件用户将提供512到2048之间。因此,请根据此选择您的精灵表大小。
您要呈现的内容。您希望能够从一个精灵表中尽可能多地渲染。你想要避免的是频繁的纹理切换。如果你的世界被划分为多个层次,如果你可以将每个层的精灵都放在他们自己的工作表上,你就可以了。没有任何硬件可以阻止20个纹理变化;这是成千上万的问题。
主要的是渲染一次使用工作表的所有内容。不一定在同一个渲染调用中;你可以切换网格和着色器制服/固定功能状态。但是,在您渲染该工作表所需的所有内容之前,不应在这些渲染之间切换工作表。