¿Cómo se determina si WPF está utilizando Hardware o Software Rendering?

Estoy evaluando una aplicación WPF en varias plataformas y necesito una forma fácil de determinar si WPF está utilizando la representación de hardware o software.

Me parece recordar un llamado para determinar esto, pero no puedo ponerlo en mis manos ahora mismo.

Además, ¿existe una forma fácil y basada en código para forzar una tubería de renderizado sobre la otra?

Compruebe el RenderCapability.Tier

[ ACTUALIZAR ]

  • RenderCapability.IsPixelShaderVersionSupported – Obtiene un valor que indica si la versión del sombreador de píxeles especificado es compatible.
  • RenderCapability.IsShaderEffectSoftwareRenderingSupported – Obtiene un valor que indica si el sistema puede representar efectos de bitmap en el software.
  • RenderCapability.Tier – Obtiene un valor que indica el nivel de representación para el hilo actual.
  • RenderCapability.TierChanged : se produce cuando el nivel de representación ha cambiado para el objeto Dispatcher del hilo actual.

RenderCapability.Tier >> 16

  • Rendering Tier 0 – Sin aceleración de hardware de gráficos. El nivel de versión de DirectX es menor que la versión 7.0.
  • Render Tier 1 : aceleración de hardware de gráficos parciales. El nivel de versión de DirectX es mayor o igual que la versión 7.0 y menor que la versión 9.0.
  • Rendering Tier 2 : la mayoría de las funciones de gráficos usan aceleración de hardware de gráficos. El nivel de versión de DirectX es mayor o igual que la versión 9.0.

.NET 4.0 proporciona la capacidad de forzar la representación del software en el código:

public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { if (WeThinkWeShouldRenderInSoftware()) RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly; } } 

Vea esta publicación para más información.

Según los enlaces de RenderingTier , aquí hay un código:

  logger.InfoFormat("WPF Tier = {0}",RenderCapability.Tier / 0x10000); RenderCapability.TierChanged += (sender, args) => logger.InfoFormat("WPF Tier Changed to {0}", RenderCapability.Tier / 0x10000); 

Todavía estoy probando y trabajando en esto. Ver ediciones / respuestas futuras de lo que encuentro.

Quizás lo siguiente puede ayudar con la segunda parte de su pregunta, es decir, ¿puede forzar una tubería de renderizado sobre otra?

Puede cambiar una configuración de registro para deshabilitar la aceleración de hardware y forzar la representación del software en todo momento. A menudo usamos esto para ver si un problema en particular que estamos viendo … está relacionado con los controladores de video. Como un ejemplo de lo que estoy hablando vea esta publicación en el foro de WPF .

Sin embargo, una cosa obvia a tener en cuenta aquí es que esto afecta a todas las aplicaciones de WPF y realmente solo debería usarse con fines de prueba.

Para deshabilitar la aceleración de hardware:

 [HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics] "DisableHWAcceleration"=dword:00000001 

Para habilitar la aceleración de hardware:

 [HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics] "DisableHWAcceleration"=dword:00000000 

Consulte este enlace de MSDN para obtener más información.

O usa las herramientas de creación de perfiles …

Se agregó una nueva checkbox para matizar los elementos de la aplicación de destino que utilizan los efectos de bitmap heredados de SW.

Estoy de acuerdo con la segunda respuesta, pero eso solo dice algo acerca de la capacidad de la máquina para ejecutarse utilizando la representación de hw, no si la aplicación realmente se procesó.

Hice una aplicación simple usando un canvas y simplemente rotando un rectángulo con RotateTransform utiliza mucho CPU para una aplicación renderizada en hw. Eso y el valor ‘RenderCapability.Tier’ es 2, por lo que hay suficiente capacidad de hw para hacerlo.

¿Por qué entonces no?

Para responder a la segunda mitad de su pregunta, no hay forma de que realmente crea forzar un camino sobre el otro. La representación de hardware se usa automáticamente si está disponible; de ​​lo contrario, el software sí lo está.

Si necesita probarlo en modo Software, necesitará usar una máquina de baja especificación o usar Escritorio remoto para ver la aplicación que se ejecuta en otra computadora. Sin embargo, aparte de la reducción del rendimiento / velocidad de fotogtwigs, no debería haber diferencias visibles en la apariencia entre los dos. Utilice la clase RenderCapability para saber si debe deshabilitar elementos como la animación o los efectos a favor del rendimiento.

Intereting Posts