Question

Je compare une application WPF sur différentes plates-formes et j'ai besoin d'un moyen simple de déterminer si WPF utilise un rendu matériel ou logiciel.

Il semble que je me souvienne d'un appel pour déterminer cela, mais je ne peux pas mettre la main dessus maintenant.

De même, existe-t-il un moyen simple, basé sur du code, de forcer un pipeline de rendu sur l'autre?

Était-ce utile?

La solution

Vérifiez le niveau RenderCapability.

[ UPDATE ]

  • RenderCapability.IsPixelShaderVersionSupported - Obtient une valeur indiquant si la version du shader de pixels spécifié est prise en charge.
  • RenderCapability.IsShaderEffectSoftwareRenderingSupported - Obtient une valeur indiquant si le système peut restituer des effets bitmap dans le logiciel.
  • RenderCapability.Tier - Obtient une valeur indiquant le niveau de rendu du thread actuel.
  • RenderCapability.TierChanged - Se produit lorsque le niveau de rendu a été modifié pour l'objet Dispatcher du thread en cours.

RenderCapability.Tier > > 16

  • Niveau de rendu 0 : aucune accélération matérielle graphique. Le niveau de version de DirectX est inférieur à la version 7.0.
  • Rendu de niveau 1 : accélération matérielle partielle des graphiques. Le niveau de version de DirectX est supérieur ou égal à la version 7.0 et inférieur à la version 9.0.
  • Rendu de niveau 2 : la plupart des fonctionnalités graphiques utilisent l'accélération matérielle graphique. Le niveau de version de DirectX est supérieur ou égal à la version 9.0.

Autres conseils

.NET 4.0 permet de forcer le rendu du logiciel dans le code:

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

Voir cet article pour plus d'informations.

Basé sur le Liens RenderingTier , voici du code:

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

Je teste et travaille toujours là-dessus. Voir les modifications / réponses futures pour ce que je trouve.

Peut-être que les éléments suivants peuvent vous aider avec la deuxième partie de votre question, à savoir, pouvez-vous forcer un pipeline de rendu sur un autre:

Vous pouvez modifier un paramètre du registre pour désactiver l'accélération matérielle et forcer le rendu du logiciel à tout moment. Nous l'utilisons souvent pour voir si un problème particulier que nous constatons ... est lié aux pilotes vidéo. Comme exemple de ce dont je parle, voyez ceci Article de forum WPF .

Une chose évidente à noter ici cependant ... est que cela affecte toutes les applications WPF et ne devrait en réalité être utilisé qu'à des fins de test.

Pour désactiver l'accélération matérielle:

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

Pour activer l'accélération matérielle:

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

Découvrez ce lien MSDN pour plus d'informations.

Ou utilisez les Outils de création de profils ... ...

  

Une nouvelle case à cocher a été ajoutée pour colorer les éléments de l'application cible qui utilisent les effets bitmap hérités rendus par SW.

Je suis d'accord avec la deuxième réponse, mais cela ne dit que quelque chose sur la capacité de la machine à fonctionner en utilisant le rendu hw, pas si l'application est réellement rendue en hw.

J'ai créé une application simple à l'aide d'un canevas et il suffit de faire pivoter un rectangle avec RotateTransform pour utiliser beaucoup de temps processeur pour une application rendue puissante. Cela et la valeur 'RenderCapability.Tier' sont 2, il y a donc assez de capacité en hw pour le faire.

Pourquoi ne pas alors?

Pour répondre à la seconde partie de votre question, il n’ya aucun moyen, à mon avis, de forcer les uns les autres. Le rendu matériel est automatiquement utilisé s'il est disponible, sinon le logiciel est.

Si vous devez le tester en mode logiciel, vous devez utiliser un ordinateur peu performant ou utiliser le Bureau à distance pour afficher l'application en cours d'exécution sur un autre ordinateur. Hormis la réduction des performances / du nombre d'images par seconde, il ne devrait y avoir aucune différence apparente d'aspect entre les deux. Utilisez la classe RenderCapability pour savoir si vous devez désactiver des éléments tels que l’animation ou les effets en faveur de la performance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top