www.rolandk.de
- Aktuelle Themen zu .Net -
Achtung: Hier handelt es sich um meine alte Seite.
Die aktuelle ist unter folgendem Link erreichbar: www.rolandk.de/wp/
Home Blog Performance von 3D-Rendering mit C# und WinRT




















































Performance von 3D-Rendering mit C# und WinRT
Sonntag, den 16. Dezember 2012 um 20:10 Uhr

Performance ist ein wichtiges Thema. Seit ich mit dem kleinen Hobby-Projekt Mosaic Snake 3D begonnen habe, teste ich es regelmäßig auf meinem Desktop-PC. Von der Performance her selbstverständlich kein Thema, da gute Grafikkarte, Prozessor und 16 GB Ram zur Verfügung stehen. Seit einigen Wochen allerdings teste ich das Programm auch regelmäßig auf meinem neuen Surface Tablet mit Windows RT - und da sah das Thema zunächst schlechter aus.

 

Häufige kleine Ruckler bereits nach Starten des Spiels und je länger die Schlange wird, desto schlechter wird die Frame-Rate. Anfangs sah es mit der Performance des Spiels auf dem Windows RT Tablet eher mies aus. Also was tun? Zunächst mithilfe des Profilers von Visual Studio 2012 versuchen, Performance-Lücken zu finden - so dachte ich zumindest. Und tatsächlich, auf diese Weise kam das eine oder andere Thema ans Tageslicht:

  • Viele Matrix-Berechnungen ziehen Leistung vom Prozessor
  • Häufige redundante Kommunikation zwischen CPU und GPU (Änderung von Shader-Variablen)
  • ...

Ein paar Anpassungen später sah das Spiel auf dem Tablet zwar besser, aber noch nicht perfekt aus. Als ich mit dem Profiler nicht mehr weitergekommen bin, habe ich etwas im Internet gestöbert.. und schließlich einen guten Hinweis gefunden. Dieser Link auf Msdn beinhaltet viele nützliche Infos. Für meinen Fall besonders wichtig ist der Hinweis "Limit the number of immediate visual XAML elements under a SwapChainBackgroundPanel". Und etwas weiter im Text: "too many or unnecessarily large XAML elements can impact overall performance". Ganz genau das war dann auch mein Problem. Ich nutze ein SwapChainBackgroundPanel und habe ein Xaml-Element komplett darüber gelegt, um darauf etwa ein kleines Control für "GameOver" oder "Pause" anzuzeigen. Es war also quasi immer da aber halt meistens auf "unsichtbar" geschaltet. Ein einfaches Entfernen genau dieses Elements hat die Performance auf dem Windows RT Tablet deutlich gesteigert. "Cool?" dachte ich an der Stelle, da hat man relativ leicht die Möglichkeit, über sein 3D-Fenster Xaml-Elemente zu platzieren und plötzlich stellt man fest, dass genau das zu großen Performance-Problemen führt. Lösung des Problems war für mich, die Xaml-Elemente nicht nur unsichtbar zu machen, sondern ganz zu entfernen, solange sie nicht dargestellt werden.

 

Folgendes will ich daher jedem ans Herz legen, der so wie ich in einer Windows Store App mit einem SwapChainRenderTarget 3D-Grafiken rendert: So wenig Xaml-Elemente darüber legen, wie möglich!

 

Hier noch ein Screenshot der aktuellen Version (läuft ohne Probleme auf dem Surface Tablet mit Windows RT):

 

 

 

Kommentar hinzufügen

Ihr Name:
Kommentar: