我使用http://rastertek.com/上的教程一直在使用c ++编写的DirectX 10 2D引擎 我的精灵系统基于http://rastertek.com/dx10tut11.html并且一直运行良好,直到我尝试渲染大小为1920x1080的背景纹理。
我遇到的问题是,如果我将较小的纹理绘制到大约2800,则FPS从3000下降到1800。 我知道绘制大纹理总会对性能产生影响,但必须有一种方法来优化这一点。 首先,我认为它与顶点缓冲区是动态的有关,但将其更改为默认值并未优化性能。 着色器代码非常简单:计算顶点相对于视图矩阵的位置,像素着色器使用纹理坐标绘制它们。 我一直在考虑使用DirectX 10中包含的D3DXSPRITE系统,但它已经在DirectX 11中被取出,所以我决定反对它。
所以经过这个漫长的解释,我的问题是:如何优化我的代码来绘制大纹理?您是否建议使用任何解决方案?
答案 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
如果要进一步优化,可以进行边界检查以查看精灵是否重叠。如果他们不这样做,你可以合并批次,虽然这对透支没有帮助,因为你首先没有任何批次。
因此,上述内容应该可以帮助您优化性能,但以下是其他一些与半相关的提示: