请原谅我,如果我的术语不正确,因为我不熟悉游戏编程。我一直在研究一些开源项目,并注意到一些精灵被分成几个文件,所有文件都被组合在一起,使得一个2d对象看起来像是动画。那是直截了当的。然后我将看到一种不同的方法,将2d对象全部放在一个png文件或类似的东西中,彼此相邻。
使用一种方法对另一种方法有优势吗?精灵应该在单独的文件中吗?为什么他们有时都在一张纸上?
答案 0 :(得分:15)
前一种方法通常更简单,易于编程,因此您可以在开源项目中看到很多方法。
第二种方法在现代图形硬件上更有效,因为它允许您通过指定不同的u,v坐标从一个大纹理中绘制多个不同的精灵,以从复合纸张中选择每个单独的精灵。因为u,v坐标可以与顶点数据一起流式传输到着色器,这使得您可以比为每个多边形切换纹理(这意味着更改着色器状态)更有效地绘制一大组精灵。这意味着你可以每毫秒绘制更多的精灵,从而在屏幕上获得更多精灵。
答案 1 :(得分:5)
每当你切换当前绑定的纹理时,你都会受到惩罚(如果系统内存不足并且开始进出分页纹理,有时会非常大)。所以用一个纹理绘制的东西越多越好。走向极端,如果你从未切换纹理绑定,你将受到0惩罚。
另一方面,视频卡限制了纹理的最大尺寸,因此您只能将较小的纹理分组为大纹理。卡越旧,您可以使用的纹理尺寸越小。因此,如果你想让你的游戏适用于各种各样的卡片,你必须将纹理限制在更正常的尺寸(或者为不同的卡片设置不同的纹理)。
另一个问题是,有时虚拟世界中的东西并不适合像这样分组。虽然你的UI(窗框,按钮等)的每一个小装饰都可以有一个很大的纹理,但是你会有更难的时间为不同的敌人使用单一的纹理,因为它们可能甚至不会出现在屏幕上同时,或者你可能无法一个接一个地绘制它们,因为透明度需要从后到前的绘图方案。
答案 2 :(得分:2)
不久前,使用打包精灵而不是单独精灵的一个原因是图形硬件仅限于二次幂纹理(256,512,1024,...)。因此,如果不打包精灵,就会浪费大量内存,因为在上传之前必须将所有内容放大到2维。将多个精灵打包成单个纹理。
另一个原因是从HD加载一个大图像文件要快得多,然后加载数百个小图像文件。这仍然是这种情况,因为文件访问每个文件都有相当大的开销,因此您拥有的文件越少,速度就越快。特别是对于小精灵,您可以轻松地将一百个文件转换为一个文件,因此可以非常明显地保存。
然而,还有理由反对在一个纹理中包含所有内容。因为一个OpenGL不再局限于二次幂纹理,所以任何大小都可以工作。但更重要的是,将所有内容打包在一个纹理中会产生负面影响。例如,当你在游戏中进行大量缩放时,你必须要小心精灵的边界,因为颜色会混合到相邻的精灵中,给你带来难看的瑕疵。您可以通过在精灵周围添加额外空间来在一定程度上避免这种情况,但这不是一个完美的解决方案。将所有内容都放在一个纹理中也会限制您可以对图像执行的操作。对于某些效果(例如瀑布),您可能希望通过简单地偏移纹理的UV坐标来进行动画,当所有内容都打包到单个纹理中时,您无法轻松完成。