使用 directX 10 绘制大型精灵时性能低下
Low performance when drawing large sprite with directX 10
我一直在研究 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 O3A1 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 作为其核心。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 在容量内调整矢量大小时的性能影响
- 了解算法的性能差异(如果以不同的编程语言实现)
- 未达到的情况会影响开关外壳性能
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- OpenGL 着色器不绘制任何东西 - 糟糕的精灵类
- 哪种方法更好,性能明智
- C++ 特征库:引用的性能开销<>
- 与多个 for 循环与单个 for 循环 wrt 相关的性能从多映射获取数据
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- 使用 directX 10 绘制大型精灵时性能低下