使用directX 10绘制大型精灵时效果不佳

时间:2013-09-20 16:06:31

标签: c++ directx textures sprite

我使用http://rastertek.com/上的教程一直在使用c ++编写的DirectX 10 2D引擎 我的精灵系统基于http://rastertek.com/dx10tut11.html并且一直运行良好,直到我尝试渲染大小为1920x1080的背景纹理。

我遇到的问题是,如果我将较小的纹理绘制到大约2800,则FPS从3000下降到1800。 我知道绘制大纹理总会对性能产生影响,但必须有一种方法来优化这一点。 首先,我认为它与顶点缓冲区是动态的有关,但将其更改为默认值并未优化性能。 着色器代码非常简单:计算顶点相对于视图矩阵的位置,像素着色器使用纹理坐标绘制它们。 我一直在考虑使用DirectX 10中包含的D3DXSPRITE系统,但它已经在DirectX 11中被取出,所以我决定反对它。

所以经过这个漫长的解释,我的问题是:如何优化我的代码来绘制大纹理?您是否建议使用任何解决方案?

1 个答案:

答案 0 :(得分:2)

链接中的教程表明在绘制精灵时应禁用Z缓冲区。只有在进行alpha混合时,这才是正确的。要优化绘制大型精灵,您应该启用Z缓冲区,并从前到后绘制不透明精灵的批次(尽可能大),同时保持alpha混合精灵的前后排序。这有助于避免过度绘制,这可能是您所看到的帧率降低的原因。

例如,如果您想要按此顺序渲染一些不透明(Oi)和alpha混合(Ai)精灵:

O1 O2 O3 A1 A2 O4 O5 O6 A3 A4 O7

你应该这样渲染它们:

[Z-enable] O3 O2 O1 [Z-disable] A1 A2 [Z-enable] O6 O5 [z-disable] A3 A4 O7

如果要进一步优化,可以进行边界检查以查看精灵是否重叠。如果他们不这样做,你可以合并批次,虽然这对透支没有帮助,因为你首先没有任何批次。

因此,上述内容应该可以帮助您优化性能,但以下是其他一些与半相关的提示:

  • 不要专注于优化荒谬的帧率。相反,尝试增加工作量,直到大约60-120 FPS,然后进行优化。显示驱动程序设计达到60FPS,甚至可以缩小性能,以便在渲染速度快的情况下节省电量。
  • 除非您迫切需要定位Windows Vista RTM,否则应切换到Direct3D 11(在Vista上支持某些Windows更新,Windows 7+本机)。它基本上是相同的API,只是速度更快,支持更好。
  • 看一下DirectX Tool Kit的SpriteBatch实现。它可能会为您寻找所需的一切,并使用D3D11作为核心。