0

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

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

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

4

1 回答 1

2

您链接中的教程表明您应该在绘制精灵时禁用 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 Tool Kit的 SpriteBatch 实现。它可能会满足您的所有需求,并以 D3D11 为核心。
于 2013-09-20T22:18:28.073 回答