¿Cómo se determina si WPF está utilizando la representación de hardware o software?

StackOverflow https://stackoverflow.com/questions/149763

  •  02-07-2019
  •  | 
  •  

Pregunta

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

Parece que recuerdo una llamada para determinar esto, pero no puedo poner mis manos en este momento.

Además, ¿hay una manera fácil y basada en código para forzar una canalización de representación sobre la otra?

¿Fue útil?

Solución

Verifique el RenderCapability.Tier

[ ACTUALIZACIÓN ]

  • RenderCapability.IsPixelShaderVersionSupported : obtiene un valor que indica si se admite la versión de sombreador de píxeles especificada.
  • RenderCapability.IsShaderEffectSoftwareRenderingSupported : obtiene un valor que indica si el sistema puede generar efectos de mapa de bits en el software.
  • RenderCapability.Tier : obtiene un valor que indica el nivel de representación para el subproceso actual.
  • RenderCapability.TierChanged : se produce cuando el nivel de representación ha cambiado para el objeto Dispatcher del hilo actual.

RenderCapability.Tier > > 16

  • Nivel de representación 0 : sin aceleración de hardware de gráficos. El nivel de versión de DirectX es inferior a la versión 7.0.
  • Representación de nivel 1 : aceleración parcial de hardware de gráficos. 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.
  • Representación de nivel 2 : la mayoría de las funciones gráficas 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.

Otros consejos

.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;    
    }
}

Ver esta publicación para obtener más información.

Basado en la RenderingTier links , 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 futuras ediciones / respuestas para lo que encuentre.

Quizás lo siguiente pueda ayudarlo con la segunda parte de su pregunta, es decir, ¿puede forzar una canalización de representación sobre otra:

Puede cambiar la configuración del 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 ejemplo de lo que estoy hablando, vea esto publicación en el foro de WPF .

Sin embargo, una cosa obvia a tener en cuenta aquí ... es que esto afecta a todas aplicaciones WPF y realmente solo debe 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 MSDN para obtener más información.

O utilice las Herramientas de creación de perfiles ...

  

Se agregó una nueva casilla de verificación para teñir los elementos de la aplicación de destino que usan efectos de mapa de bits heredados procesados ??por SW.

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

Hice una aplicación simple usando un lienzo y simplemente girando un rectángulo con RotateTransform utiliza mucha CPU para una aplicación renderizada hw. Eso y el valor 'RenderCapability.Tier' es 2, por lo que hay suficiente capacidad de hardware para hacerlo.

¿Por qué no entonces?

Para responder a la segunda mitad de su pregunta, no creo que haya una forma de forzar una forma sobre la otra. El renderizado de hardware se usa automáticamente si está disponible; de ??lo contrario, el software sí lo está.

Si necesita probarlo en modo Software, deberá 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 un rendimiento / velocidad de fotogramas reducido, no debería haber diferencias visibles en la apariencia entre los dos. Use la clase RenderCapability para saber si debe deshabilitar elementos como la animación o los efectos a favor del rendimiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top