- 我如何能够改善我的 Direct3D 应用程序的性能?
-
发布时间:2010-11-23 15:36:12
发布时间:2010-11-23 15:36:12
在优化性能时,需要考察下列几个关键问题: ·批处理大小 Direct3D 已为大批量原语进行过优化。一次调用所能发送的多边形越多,其效果也就越好。凭经验而论,建议平均每次调用100 个以上的多边形。低于该水平,您可能不会得到最好的性能,而高于该水平,您收到的效果会递减,且可能会与并行事项发生冲突(参见下面的论述)。 ·状态更改 更改描绘状态这种操作可能会很昂贵,尤其是在更改纹理时。因此,每帧所作的状态更改应尽可能地少,这一点很重要。另外,请尽量降低对顶点或索引缓冲区的更改。注意:在 DirectX 中更改缓冲区已不在象在以前版本中那样昂贵了,但依旧建议尽量避免更改顶点缓冲区。 ·并行 如果能够安排描绘与其它处理同时进行,则您可以充分利用系统性能。这一目标可能会与降低描绘状态更改的目标相抵触。您需要在进行批处理以降低状态更改和较早将数据推出到驱动程序以达到并行目的之间找到一个平衡点。以循环方式使用多个顶点缓冲区,会有助于并行功能。 ·纹理上载 将纹理上载到设备会消耗带宽并导致与顶点数据争用带宽。因此,不要占用过多的内存这一点很重要,因为这会强制缓存方案为每一帧上载过多的纹理。 ·顶点缓冲区和索引缓冲区 您应当一直使用顶点缓冲区和索引缓冲区,而不是由应用程序分配的普通内存块。顶点缓冲区和索引缓冲区的锁定语义至少可以避免多于的复制操作。对于某些驱动程序,顶点缓冲区和索引缓冲区可能是更理想的存储器中的某些区域(可能是在视频或 AGP 存储器中),供硬件进行访问。 ·状态宏锁定 这些是在 DirectX 7.0 中推出的,为将一系列的状态更改(包括照明、材质和矩阵更改)记录成一个宏提供了一个机制,该宏然后就可以通过单一的调用来重放了。这有两个优势: 您进行一次调用而不是多次调用,从而降低调用开销。 有感悟能力的驱动程序可以对状态更改进行预分析和预编译,从而使到图形硬件的提交速度快得多。状态更改可能依旧很昂贵,但使用状态宏至少会有助于降低部分成本。 ·仅使用单独一个 Direct3D 设备 如果您需要描绘到多个目标,则请使用 SetRenderTarget。如果您是要创建一个带有多个 3D 窗口的窗口化程序,则请使用 CreateAdditionalSwapChain API。运行时已为单一设备进行过优化,使用多个设备时会有相当多的速度折扣。