3

如果我的术语不正确,请原谅我,因为我是游戏编程的新手。我一直在查看一些开源项目,并注意到一些 sprite 被分成几个文件,所有这些文件都组合在一起以使 2d 对象看起来像是在动画。这是直截了当的。然后我会看到一种不同的方法,将 2d 对象全部放在一个 png 文件或类似文件中,彼此相邻。

将一种方法用于另一种方法是否有优势?精灵应该在单独的文件中吗?为什么有时它们都在一张纸上?

4

3 回答 3

15

前一种方法通常更直接且易于编程,因此您可以在开源项目中看到很多。

第二种方法在现代图形硬件上更有效,因为它允许您通过指定不同的 u,v 坐标从复合表中选择每个单独的精灵,从一个大纹理中绘制多个不同的精灵。因为 u,v 坐标可以与顶点数据一起流式传输到着色器,所以与必须为每个多边形切换纹理(这意味着更改着色器状态)相比,这使您可以更有效地绘制一大组精灵。这意味着您可以每毫秒绘制更多精灵,从而在屏幕上获得更多。

于 2009-09-21T04:00:37.303 回答
5

每次切换当前绑定的纹理时,都会受到惩罚(如果系统内存不足并开始将纹理分页进出,有时会受到很大的惩罚)。因此,您可以使用一种纹理绘制的东西越多越好。走极端,如果你从不切换纹理绑定,你会招致 0 罚分。

另一方面,显卡限制了纹理的最大尺寸,因此您只能将较小的纹理组合成一个大纹理。卡越旧,您可以使用的纹理尺寸就越小。因此,如果您想让您的游戏在多种卡片上运行,您必须将纹理限制为更正常的尺寸(或为不同的卡片设置不同的纹理集)。

另一个问题是,有时你的虚拟世界中的东西并不适合像这样分组。虽然你可以为你的用户界面(窗口框架、按钮等)的每一个小装饰都设置一个大纹理,但你将很难为不同的敌人使用单一纹理,因为它们甚至可能不会出现在屏幕上同时,或者由于透明度所需的从后到前的绘图方案,您可能无法一个接一个地绘制它们。

于 2009-09-21T04:07:19.393 回答
2

不久前,使用打包 sprite 而不是单独的 sprite 的一个原因是图形硬件仅限于二次幂纹理(256、512、1024,...)。因此,不打包精灵会浪费大量内存,因为在上传之前必须将所有内容放大到二维的幂。将多个精灵打包到一个纹理中可以解决这个问题。

另一个原因是从 HD 加载一个大图像文件比加载数百个小图像文件要快得多。情况仍然如此,因为文件访问会为每个文件带来相当大的开销,因此您拥有的文件越少,事情就会变得越快。尤其是对于小精灵,您可以轻松地将数百个文件变成一个文件,因此节省的空间非常明显。

然而,也有理由反对将所有东西都放在一个纹理中。对于一个 OpenGL 不再局限于二次幂纹理,因此任何尺寸都可以使用。但更重要的是,将所有东西都包装在一个纹理中会产生负面影响。例如,当您在游戏中进行大量缩放时,您必须注意精灵的边界,因为颜色会混合到相邻的精灵中,从而给您带来难看的伪影。您可以通过在精灵周围添加额外空间来在一定程度上避免这种情况,但这不是一个完美的解决方案。将所有内容都放在一个纹理中也限制了您可以对图像执行的操作。对于某些效果,例如瀑布,您可能希望通过简单地偏移纹理的 UV 坐标来制作动画,但当所有内容都打包到单个纹理中时,您就不能那么容易地做到这一点。

于 2009-09-22T18:18:32.287 回答