Direct3D9 和 WPF 互作性的性能注意事项

可以使用 D3DImage 类托管 Direct3D9 内容。 托管 Direct3D9 内容可能会影响应用程序的性能。 本主题介绍在 Windows Presentation Foundation (WPF) 应用程序中托管 Direct3D9 内容时优化性能的最佳做法。 这些最佳做法包括在使用 Windows Vista、Windows XP 和多监视器显示时如何使用 D3DImage 和最佳做法。

注释

有关演示这些最佳做法的代码示例,请参阅 WPF 和 Direct3D9 互作

谨慎使用 D3DImage

D3DImage 实例中托管的 Direct3D9 内容的渲染速度不如在纯 Direct3D 应用程序中快。 复制表面和刷新命令缓冲区可能会耗费较大的代价。 随着D3DImage实例数的增加,会发生更多的刷新,性能会下降。 因此,应谨慎使用 D3DImage

Windows Vista 上的最佳做法

为了在 Windows Vista 上使用配置为使用 Windows 显示驱动程序模型(WDDM)的显示器获得最佳性能,请在 IDirect3DDevice9Ex 设备上创建 Direct3D9 图面。 这使表面共享。 视频卡必须在 Windows Vista 上支持 D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURESD3DCAPS2_CANSHARERESOURCE 驱动程序功能。 任何其他设置都会导致通过软件复制图面,从而显著降低性能。

注释

如果 Windows Vista 具有配置为使用 Windows XP 显示驱动程序模型(XDDM)的显示器,则无论设置如何,都会始终通过软件复制图面。 在正确设置和视频卡的支持下,使用 WDDM 时,Windows Vista 的性能会更好,因为表面复制是在硬件中进行的。

Windows XP 上的最佳做法

为了在使用 Windows XP 显示驱动程序模型(XDDM)的 Windows XP 上获得最佳性能,请创建一个可锁定的表面,该表面当调用 IDirect3DSurface9::GetDC 方法时表现正确。 在内部,该方法通过硬件在设备之间传输图形界面。 该方法 GetDC 始终在 XRGB 图面上工作。 但是,如果客户端计算机使用 SP3 或 SP2 运行 Windows XP,并且客户端还具有分层窗口功能的修补程序,则此方法仅适用于 ARGB 图面。 视频卡必须支持 D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES 驱动程序功能。

16 位桌面显示深度可以显著降低性能。 建议使用 32 位桌面。

如果要针对 Windows Vista 和 Windows XP 进行开发,请测试 Windows XP 上的性能。 Windows XP 上的视频内存不足是一个问题。 此外, D3DImage Windows XP 上的视频内存和带宽比 Windows Vista WDDM 多,因为需要额外的视频内存复制。 因此,对于同一视频硬件,Windows XP 的性能可能比 Windows Vista 上的性能更差。

注释

XDDM 在 Windows XP 和 Windows Vista 上都可用;但是,WDDM 仅在 Windows Vista 上可用。

常规最佳做法

创建设备时,请使用 D3DCREATE_MULTITHREADED 创建标志。 这降低了性能,但 WPF 呈现系统从另一个线程调用此设备上的方法。 请务必正确遵循锁定协议,这样两个线程就不能同时访问设备。

如果您的渲染是在 WPF 托管线程上执行,强烈建议您使用 D3DCREATE_FPU_PRESERVE 创建标志来创建设备。 如果没有此设置,D3D 渲染可能会降低 WPF 双精度浮点运算的准确性,并引入渲染问题。

平铺 D3DImage 的速度很快,除非是在没有硬件支持的情况下平铺非2的幂次的图面,或是平铺包含D3DImageDrawingBrushVisualBrush

多监视器显示器的最佳做法

如果使用的是具有多个监视器的计算机,则应遵循前面所述的最佳做法。 多监视器配置还有一些额外的性能注意事项。

创建后缓冲区时,它会在特定设备和适配器上创建,但 WPF 可能会在任何适配器上显示前缓冲区。 跨适配器复制以更新前端缓冲区可能非常昂贵。 在配置为将 WDDM 与多个视频卡和设备一起使用 IDirect3DDevice9Ex 的 Windows Vista 上,如果前缓冲区位于不同的适配器上,但仍具有相同的视频卡,则不会造成性能损失。 但是,在具有多个视频卡的 Windows XP 和 XDDM 上,前缓冲区显示在与后缓冲区不同的另一个适配器上时,会有显著的性能损失。 有关详细信息,请参阅 WPF 和 Direct3D9 互作

性能摘要

下表显示了前端缓冲区更新的性能,这取决于操作系统、像素格式和图面可锁定性。 假定前缓冲区和后缓冲区位于同一适配器上。 根据适配器配置,硬件更新通常比软件更新快得多。

表面像素格式 Windows Vista、WDDM 和 9Ex 其他 Windows Vista 配置 Windows XP SP3 或 SP2 带修补程序 Windows XP SP2
D3DFMT_X8R8G8B8 (不可锁定) 硬件更新 软件更新 软件更新 软件更新
D3DFMT_X8R8G8B8 (可锁定) 硬件更新 软件更新 硬件更新 硬件更新
D3DFMT_A8R8G8B8 (不可锁定) 硬件更新 软件更新 软件更新 软件更新
D3DFMT_A8R8G8B8 (可锁定) 硬件更新 软件更新 硬件更新 软件更新

另请参阅