Frage

Ich Benchmarking eine WPF-Anwendung auf verschiedene Plattformen und ich brauche eine einfache Möglichkeit, um festzustellen, ob WPF Hardware- oder Software-Rendering verwendet.

Ich scheine einen Anruf zu erinnern, dies zu bestimmen, kann aber meine Hände auf es jetzt nicht schaffen.

Auch ist es eine einfache, Code basiert Weise eine Rendering-Pipeline über die andere zu zwingen?

War es hilfreich?

Lösung

Überprüfen Sie die RenderCapability.Tier

[ UPDATE ]

  • RenderCapability.IsPixelShaderVersionSupported -. Ruft einen Wert ab, der angegebene Pixel-Shader-Version gibt an, ob unterstützt
  • RenderCapability.IsShaderEffectSoftwareRenderingSupported - Ruft einen Wert, der das System zeigt an, ob Bitmap-Effekte in der Software machen kann.
  • RenderCapability.Tier - Ruft einen Wert, der die Rendering-Ebene für den aktuellen Thread anzeigt.
  • RenderCapability.TierChanged - Tritt ein, wenn die Rendering-Ebene hat für das Dispatcher-Objekt des aktuellen Threads geändert.

RenderCapability.Tier >> 16

  • Rendering Tier 0 - Keine Grafikhardwarebeschleunigung. Der DirectX-Version Pegel kleiner als Version 7.0.
  • Rendering-Tier-1 - Teilgrafikhardwarebeschleunigung. Das DirectX-Version Niveau größer als oder gleich die Version 7.0 und kleiner als Version 9.0.
  • Rendering Tier 2 - Die meisten Grafikfunktionen Grafikhardwarebeschleunigung verwenden. Das DirectX-Version Niveau größer als oder gleich die Version 9.0.

Andere Tipps

.NET 4.0 bietet die Möglichkeit, Software-Rendering zu zwingen, in dem Code ein:

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

Siehe dieser Beitrag für weitere Informationen.

Basierend auf der RenderingTier Links , hier einige Code ist:

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

Ich bin immer noch testen und arbeiten daran. Siehe zukünftige Änderungen / Antworten für das, was ich finde.

Vielleicht können die folgenden mit dem zweiten Teil Ihrer Frage helfen, das heißt, können Sie eine Rendering-Pipeline über eine andere Kraft:

Sie können eine Registrierungseinstellung ändern Hardware-Beschleunigung und Kraft-Software deaktivieren Rendering jederzeit auftreten. Wir nutzen dies häufig zu sehen, ob ein bestimmtes Problem, das wir sehen ... auf Grafiktreiber verwandt ist. Als ein Beispiel von dem, was ich rede zu sehen diese WPF Forum posten .

Eine offensichtliche Sache hier zu beachten, obwohl ... ist, dass dies wirkt sich auf alle WPF-Anwendungen und sollte wirklich nur zu Testzwecken verwendet werden.

Hardware-Beschleunigung deaktivieren:

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

Hardware-Beschleunigung aktivieren:

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

Sehen Sie sich diese MSDN Link für weitere Informationen.

oder die Werkzeuge Profil ...

  

New Checkbox wurde hinzugefügt, um die Zielanwendung Elemente tönen, die SW gemacht Vermächtnis Bitmap Effekte verwenden.

ich mit der zweiten Antwort agreee aber das sagt nur etwas über die Fähigkeit der Maschine hw Rendering nicht zu laufen, wenn die App tatsächlich hw gerendert wird.

habe ich eine einfache Anwendung, eine Leinwand und durch Drehen nur ein Rechteck mit RotateTransform viel zu viel CPU für eine hw gerenderten Anwendung verwendet. Das und die ‚RenderCapability.Tier‘ Wert 2, so gibt es genug hw Fähigkeit, es zu tun.

Warum funktioniert dann?

Um die zweite Hälfte Ihrer Frage zu beantworten, es gibt keinen Weg, ich glaube wirklich, einen Weg, über die andere zu erzwingen. Hardware-Rendering wird automatisch verwendet, wenn vorhanden, andernfalls Software.

Wenn Sie es in Software-Modus testen müssen, werden Sie eine niedrige spec Maschine oder verwenden Sie Remote Desktop verwenden müssen, um die Anwendung zu betrachten, auf einem anderen Computer ausgeführt wird. Neben reduzierten Leistung / Framerate jedoch sollte es nicht sein, alle sichtbaren Unterschiede im Aussehen zwischen den beiden. Verwenden Sie die RenderCapability Klasse zu wissen, wenn Sie Dinge wie Animationen oder Effekte zugunsten der Leistung deaktivieren sollte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top