使用单个ID3DXSprite对象渲染多个图像的影响

我想知道如果使用单个Sprite对象来渲染屏幕上的所有2D纹理,比在性能中使用每个2D纹理的一个Sprite更好。

编辑:使用单精灵指的是使用一个ID3DXSprite对象来呈现所有的纹理。

ID3DXSprite是一个旨在帮助高效地管理绘制精灵的对象。 没有理由有多个ID3DXSprite对象。 如果你需要不同的精灵的不同选项,那么使用多个开始/结束组。

你不应该有多于一个的原因是因为ID3DXSprite如何与设备交互。

  • 开始:准备一个绘制精灵的设备。
  • 绘制:将精灵添加到批量精灵列表中。
  • 结束:调用ID3DXSprite :: Flush并将设备状态恢复到ID3DXSprite :: Begin被调用之前的状态。

正如你所看到的开始和结束改变设备状态。 有多个开始/结束活动会打破内置的设备状态管理,所以如果你只有一个开始/结束组合,那么在多个ID3DXSprites中没有意义。

如果你的意思是,你想在一个大纹理上布置多个子文本,那么是的,这样做有好处。 这种技术被称为“纹理图集”。

第一个好处就是你的项目中会有更less的资源文件。 例如,如果要纹理具有不同纹理的立方体的六个面,则最终会生成6个纹理图像。 通过将所有材质打包成一张纹理图集,并使用校正后的UV,可以将它们打包在一个文件中。 性能优势是在加载游戏资源时需要较less的文件访问操作。

第二个好处是在渲染游戏时你需要更less的纹理交换。 在最坏的情况下,每个子文本都被绑定到不同的纹理内存中。 您需要为每个渲染的对象交换纹理,造成开销。

在精灵的情况下(比如在老式的电子游戏中),个别精灵通常被排列在网格上。 每个精灵通常对应于不同的animation姿势。 在这种情况下,通常使用术语“精灵图”来代替“纹理图集”。 但是这个概念是一样的。

需要考虑两个特点。 首先,你要确保你打包成单个纹理的子文本是相关的。 这意味着,如果使用其中一个子文本,则应该使用同一工作表上的其他子文本。 否则,你会失去纹理交换的优势。

其次,在使用线性滤波,mipmapping或各向异性mipmapping时,会出现渗色效应。 这意味着精灵将与相邻精灵的边缘融合。 为了解决这个问题,当把它们打包成图集或者图纸的时候,在你的子文本里添加一个小的边距。 降低生成的mipmap的水平也是有益的。

所以简而言之,将多个子文本打包成一个纹理是一个很好的主意! 如果边缘出血等文物出现,则在子文本周围添加一个小的边距。