【问题标题】:Sprites in game programming, multiple files vs one "texture"?游戏编程中的精灵,多个文件与一个“纹理”?
【发布时间】:2009-09-21 03:54:58
【问题描述】:

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

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

【问题讨论】:

    标签: sprite


    【解决方案1】:

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

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

    【讨论】:

    • 嘿 crashworks 感谢您的回复。关于新手在哪里可以了解更多关于 u、v 坐标、着色器等内容的任何建议?
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 虽然GL在API中接受任意大小的纹理,但硬件不一定支持;大多数驱动程序会将非 pow2 纹理填充到“引擎盖下”的 pow2(或内部图块大小的倍数)。
      猜你喜欢
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 2015-05-10
      • 2023-03-09
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多