Consideraciones de rendimiento para la interoperabilidad entre Direct3D9 y WPF

Puede hospedar el contenido Direct3D9 mediante la clase D3DImage. Hospedar contenido de Direct3D9 puede afectar al rendimiento de la aplicación. En este tema se describen los procedimientos recomendados para optimizar el rendimiento al hospedar contenido de Direct3D9 en una aplicación de Windows Presentation Foundation (WPF). Estos procedimientos recomendados incluyen cómo usar D3DImage y procedimientos recomendados al usar Windows Vista, Windows XP y pantallas de varios monitores.

Nota:

Para obtener ejemplos de código que muestran estos procedimientos recomendados, vea Interoperación de WPF y Direct3D9.

Usar D3DImage con moderación

El contenido de Direct3D9 hospedado en una instancia D3DImage no se representa tan rápido como en una aplicación Direct3D pura. Copiar la superficie y vaciar el búfer de comandos puede ser operaciones costosas. A medida que el número de instancias D3DImage aumenta, se produce un mayor vaciado y el rendimiento se degrada. Por lo tanto, debe usar D3DImage con moderación.

Procedimientos recomendados sobre Windows Vista

Para obtener el mejor rendimiento en Windows Vista con una pantalla configurada para utilizar el modelo de controlador de pantalla de Windows (WDDM), cree su superficie Direct3D9 en un dispositivo IDirect3DDevice9Ex. Esto permite el uso compartido de superficies. La tarjeta de vídeo debe admitir la funcionalidad del controlador D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES y D3DCAPS2_CANSHARERESOURCE en Windows Vista. Cualquier otra configuración hace que la superficie se copie a través del software, lo que reduce significativamente el rendimiento.

Nota:

Si Windows Vista tiene una pantalla configurada para usar el modelo de controlador de pantalla XP (XDDM) Windows XP, la superficie siempre se copia a través del software, independientemente de la configuración. Con la configuración adecuada y la tarjeta de vídeo, verá un mejor rendimiento en Windows Vista cuando use el WDDM porque las copias de superficie se realizan en el hardware.

Procedimientos recomendados sobre Windows XP

Para un mejor rendimiento en Windows XP, que utiliza el modelo de controlador de pantalla de Windows XP (XDDM), cree una superficie bloqueable que se comporte correctamente cuando se llame al método IDirect3DSurface9::GetDC. Internamente, el método BitBlt transfiere la superficie a través de los dispositivos en el hardware. El método GetDC siempre funciona en superficies XRGB. Sin embargo, si el equipo cliente ejecuta Windows XP con SP3 o SP2, y si el cliente también tiene la revisión de la característica de ventana superpuesta, este método solo funciona en superficies ARGB. La tarjeta de vídeo debe admitir la funcionalidad del controlador D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES.

Una profundidad de pantalla de 16 bits en el escritorio puede reducir significativamente el rendimiento. Se recomienda un escritorio de 32 bits.

Si está desarrollando para Windows Vista y Windows XP, pruebe el rendimiento en Windows XP. Quedarse sin memoria de vídeo en Windows XP es un problema. Además, D3DImage en Windows XP utiliza más memoria de vídeo y ancho de banda que Windows Vista WDDM, debido a una copia de memoria de vídeo adicional necesaria. Por lo tanto, puede esperar que el rendimiento sea peor en Windows XP que en Windows Vista para el mismo hardware de vídeo.

Nota:

XDDM está disponible en Windows XP y Windows Vista; sin embargo, WDDM solo está disponible en Windows Vista.

Procedimientos recomendados generales

Al crear el dispositivo, utilice la marca de creación D3DCREATE_MULTITHREADED. Esto reduce el rendimiento, pero el sistema de representación de WPF llama a métodos en este dispositivo desde otro subproceso. Asegúrese de seguir correctamente el protocolo de bloqueo, de modo que no haya dos subprocesos que accedan al dispositivo al mismo tiempo.

Si la representación se realiza en un subproceso gestionado de WPF, se recomienda encarecidamente que cree el dispositivo con la marca de creación D3DCREATE_FPU_PRESERVE. Sin esta configuración, la representación D3D puede reducir la precisión de las operaciones de precisión doble de WPF e introducir problemas de representación.

El mosaico de un D3DImage es rápido, a menos que se coloque en mosaico en una superficie que no sea pow2 sin soporte de hardware, o si se coloca en mosaico un DrawingBrush o VisualBrush que contiene un D3DImage.

Procedimientos recomendados para pantallas de varios monitores

Si usa un equipo que tiene varios monitores, debe seguir los procedimientos recomendados descritos anteriormente. También hay algunas consideraciones de rendimiento adicionales para una configuración de varios monitores.

Al crear el búfer de reserva, se crea en un dispositivo y un adaptador específicos, pero WPF puede mostrar el búfer frontal en cualquier adaptador. La copia entre adaptadores para actualizar el búfer frontal puede ser muy costosa. En Windows Vista que está configurado para usar el WDDM con varias tarjetas de vídeo y con un dispositivo IDirect3DDevice9Ex, si el búfer frontal está en un adaptador diferente pero sigue siendo la misma tarjeta de vídeo, no hay ninguna penalización de rendimiento. Sin embargo, en Windows XP y el XDDM con varias tarjetas de vídeo, hay una penalización de rendimiento significativa cuando el búfer frontal se muestra en un adaptador diferente al búfer de reserva. Para obtener más información, vea Interoperabilidad de WPF y Direct3D9.

Resumen del rendimiento

En la tabla siguiente se muestra el rendimiento de la actualización del búfer frontal como una función del sistema operativo, el formato de píxeles y la capacidad de bloqueo de la superficie. Se supone que el búfer frontal y el búfer de reserva están en el mismo adaptador. En función de la configuración del adaptador, las actualizaciones de hardware suelen ser mucho más rápidas que las actualizaciones de software.

Formato de píxeles de superficie Windows Vista, WDDM y 9Ex Otras configuraciones de Windows Vista Windows XP SP3 o SP2 con revisión Windows XP SP2
D3DFMT_X8R8G8B8 (no bloqueable) Actualización de hardware Actualización de software Actualización de software Actualización de software
D3DFMT_X8R8G8B8 (bloqueable) Actualización de hardware Actualización de software Actualización de hardware Actualización de hardware
D3DFMT_X8R8G8B8 (no bloqueable) Actualización de hardware Actualización de software Actualización de software Actualización de software
D3DFMT_A8R8G8B8 (bloqueable) Actualización de hardware Actualización de software Actualización de hardware Actualización de software

Vea también