WPF: AllowTransparency=True, Performance=False

Siguiendo un poco la línea de artículos sobre rendimiento en WPF, hablaremos de la implicación de rendimiento que aporta el uso de la propiedad AllowTransparency de WPF.

Esta propiedad nos permite crear ventanas transparentes, tanto en su totalidad, como habilitar regiones que no se dibujen en la misma y crear ventanas con formas irregulares.

Esta capacidad, no lo voy a negar, es muy llamativa para el diseño de interfaces que enfatizen el diseño de nuestra aplicación. Pero esta práctica no es del todo recomendable por los problemas de rendimento que conlleva.

Mientras la propiedad AllowTransparency esté asignada a False, no obtenemos problemas de rendiemiento derivados de la manera que tiene WPF de renderizar nuestra aplicación, este renderizado se lleva a cabo por el Pipeline de DirectX, por lo que en Windows XP se dibujará directamente en pantalla y en Windows Vista lo hará en una superficie compartida en el Desktop Window Manager.

Este gráfico refleja este proceso:guno

 

En cambio, si asignamos el valor de esta propiedad a True, nos encontraremos con un problema de rendimento en el Renderizado que deberemos tener en cuenta a la hora de llevar a cabo el diseño de nuestra aplicación.

 Para explicar un poco mejor esto, debemos entender el proceso que es llevado a cabo en cada sistema operativo. En Windows XP la superficie de dibujo de Direct3D falla con canales Alpha, ya que la implementación de este proceso en Windows XP difiere con el de Windows Vista y esto fuerza al sistema a usar el renderizado software. En cambio en Windows Vista el motivo cambia, ya que al llamar a IDirect3DSurface::GetDC() sí se lleva a cabo correctamente mediante hardware, pero al hacer uso de GDI, que en Windows Vista está emulado por software, obliga a que todo este proceso se dibuje en la memoria principal del sistema, lo que transforma esto en un proceso extremadamente lento.

Acompaño un gráfico que ilustra lo anterior:

gdos

Como conclusión, el uso de esta característica de WPF debe reservarse a casos muy concretos en el que el rendimento general de la aplicación no se vea gravemente afectado, y por lo tanto afecte a la Experiencia de Usuario de nuestra aplicación.

4 comentarios en “WPF: AllowTransparency=True, Performance=False”

  1. Gracias Eugenio,
    La verdad es que esta es una opción que buscan muchos de los diseñadores a la hora de realizar aplicaciones con WPF, y que se debe de usar con prudencia.
    Es bueno entender las implicaciones de su uso para utilizarlo correctamente.
    Un saludo.

  2. Microsoft publicó hace unos días un artículo en la Knowledge Base relacionado con este problema. Están disponibles bajo pedido los hotfixes correspondientes para Windows XP y Windows Server 2003.

    Performance is poor in a WPF-based application in which you have enabled layered windows in Windows XP or in Windows Server 2003
    http://support.microsoft.com/kb/937106/en-us

  3. Hola Ramón,
    En efecto, existen estos hotfix, pero no son parches finales, ya que microsoft recomienda esperar al hotfix que contendrá el service pack si no te afecta demasiado este problema, aunque pueden resolver el problema en ciertos escenarios.
    Además aún quedaría por resolver el problema en Windows Vista, donde se ejecutarán la mayoría de estas aplicaciones en un futuro.
    Debo decir que existen otros caminos para conseguir el mismo resultado, pero no es un camino tan sencillo como cambiar el valor a una propiedad de la ventana.
    Gracias por tus comentarios.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *