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 Vista 上使用配置为使用 Windows 显示驱动程序模型(WDDM)的显示器获得最佳性能,请在 IDirect3DDevice9Ex
设备上创建 Direct3D9 图面。 这将启用表面共享。 视频卡必须支持 Windows Vista 上的 D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES
和 D3DCAPS2_CANSHARERESOURCE
驱动程序功能。 任何其他设置都会导致通过软件复制图面,从而显著降低性能。
注意
如果 Windows Vista 具有配置为使用 Windows XP 显示驱动程序模型(XDDM)的显示器,则无论设置如何,都会始终通过软件复制图面。 当您使用 WDDM 并配置适当的设置和视频卡时,Windows Vista 将表现出更好的性能,因为表面拷贝是在硬件中执行的。
Windows XP 上的最佳做法
为了在使用 Windows XP 显示驱动程序模型(XDDM)的 Windows XP 上获得最佳性能,请创建一个可锁定的表面,以确保在调用 IDirect3DSurface9::GetDC
方法时其行为正确。 在内部,BitBlt
方法在硬件中跨设备传输图面。 GetDC
方法始终在 XRGB 图面上工作。 但是,如果客户端计算机运行的是带有 Service Pack 3 或 Service Pack 2 的 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 图面,或平铺包含 D3DImage的 DrawingBrush 或 VisualBrush,速度就会变慢。
多显示器的最佳使用指南
如果使用的是具有多个监视器的计算机,则应遵循前面所述的最佳做法。 多监视器配置还有一些额外的性能注意事项。
创建后缓冲区时,它会在特定设备和适配器上创建,但 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 (可锁定) | 硬件更新 | 软件更新 | 硬件更新 | 软件更新 |
另请参阅
- D3DImage
- WPF 和 Direct3D9 互操作
- 演练:在 WPF 中创建用于托管的 Direct3D9 内容
- 演练:在 WPF 中托管 Direct3D9 内容