使用 directX 10 绘制大型精灵时性能低下

Low performance when drawing large sprite with directX 10

本文关键字:性能 精灵 大型 directX 绘制 使用      更新时间:2023-10-16

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

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

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

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

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

O1 O2 O3

A1 A2 O4 O5 O6 A3 A4 O7

您应该以这种方式呈现它们:

[Z 启用] O3 O2 O1 [Z 禁用]

A1 A2 [Z 启用] O6 O5 [Z 禁用] A3 A4 O7

如果你想进一步优化,你可以做边界检查,看看精灵是否重叠。 如果没有,您可以合并批处理,尽管这对过度绘制没有帮助,因为您一开始就不会有任何过度绘制。

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

  • 不要专注于以荒谬的帧速率进行优化。 相反,尝试增加工作负载,直到大约 60-120 FPS,然后进行优化。 显示驱动程序旨在达到 60FPS,如果您渲染速度超过此速度,甚至可能会缩减性能以节省功耗。
  • 除非您迫切需要以 Windows Vista RTM 为目标,否则您应该切换到 Direct3D 11(在应用了一些 Windows 更新的 Vista 上受支持,并且本机支持 Windows 7+)。 它基本上是相同的API,只是速度更快,支持更好。
  • 看看 DirectX 工具包的 SpriteBatch 实现。它可能会完成您正在寻找的所有内容,并使用 D3D11 作为其核心。