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

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

注意

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

谨慎使用 D3DImage

D3DImage 实例中托管的 Direct3D9 内容的呈现速度不如纯 Direct3D 应用程序中的快。 复制图面并刷新命令缓冲区可能代价高昂。 随着 D3DImage 实例数的增加,会发生更多刷新,并且性能会下降。 因此,应谨慎使用 D3DImage

Windows Vista 上的最佳做法

对于具有配置为使用 Windows 显示驱动程序模型 (WDDM) 的显示器的 Windows Vista,若要实现最佳性能,请在 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 方法时可正常运行的可锁定图面。 在内部,BitBlt 方法在硬件中跨设备传输图面。 GetDC 方法始终适用于 XRGB 图面。 但是,如果客户端计算机运行的是带有 SP3 或 SP2 的 Windows XP,并且客户端还具有分层窗口功能的修补程序,则此方法仅适用于 ARGB 图面。 视频卡必须支持 D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES 驱动程序功能。

16 位桌面显示深度会显着降低性能。 建议使用 32 位桌面。

如果要针对 Windows Vista 和 Windows XP 进行开发,请测试 Windows XP 上的性能。 Windows XP 上的视频内存不足是一个问题。 此外,由于需要额外的视频内存副本,Windows XP 上的 D3DImage 使用的视频内存和带宽比 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 很快,除非在无硬件支持的情况下平铺非 pow2 图面,或者平铺包含 D3DImageDrawingBrushVisualBrush

多监视器显示的最佳做法

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

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

性能摘要

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

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

另请参阅