Unity durchsuchen

Asas Tipps für Shader-Profiling und Optimierung

Wir haben ein paar von Asa Reeds besten Tipps für Sie: Wie man sich zwischen einem Vertex- und einem Fragmentshader entscheidet, gute Debugging-Tools und die sieben Optimierungen, die für ihn am wichtigsten sind.

Vertex- oder Fragmentshader: Welcher soll es sein?

Vertexshader: Wenn es Ihnen hauptsächlich um die Performance geht, ist ein Vertexshader vermutlich die beste Wahl. Vertexshader arbeiten auf jedem Vertex Ihres Meshes, während ein Fragmentshader auf jedem Pixel der Dreiecke arbeitet, die von diesen Vertices zusammengestellt werden.

Vertexshader unterliegen Einschränkungen: Es ist nicht möglich, genaue Beleuchtungsdaten zu erhalten oder Texture-Mapping mit einem Vertexshader auszuführen. Es ist im Gegensatz zum Fragmentshader allerdings möglich, UV-Texturkoordinaten in beliebigem Umfang zu verschieben (zum Beispiel, um einen animierten Oberflächeneffekt zu erreichen).

Unity-shader-optimization-vertex-shader

Beispiel für ein Modell mit Vertexshader, aus: "Vertex- und Fragmentshader-Beispiele".

Beleuchtungs- und Oberflächeneffekte laufen in Vertexshadern schneller ab, führen aber zu einer geringeren visuellen Qualität/Wiedergabetreue. Alle Abläufe, die speziell auf Geometrie (Vertices) abzielen, sollten immer mit einem Vertexshader ausgeführt werden, z. B. GPU-Skinning.

Fragmentshader: Wenn Sie High-End-Visuals oder interessante Oberflächeneffekte erzielen möchten und eine fließende und richtige Beleuchtung brauchen, sollten Sie einen Fragmentshader verwenden. Achten Sie immer darauf, was genau Sie Ihren Fragmentshadern hinzufügen und versuchen Sie, diese Vorgänge zu vereinfachen oder zum Vertexshader zu verschieben.

Unity-shader-optimization-vertex-and-fragment-shaders

Das gleiche Modell mit Vertex- und Fragmentshader, aus: "Vertex- und Fragmentshader-Beispiele".

Achten Sie insbesondere in Unity auf #pragma-Defines oder andere integrierte Unity-Funktionalitäten in Ihrem Shadercode. Sie glauben vielleicht, Ihren Shader mit einer einfachen Operation wie der Modifizierung von Alpha nicht zu überlasten, aber wenn derselbe Shader "#pragma surface surf BlinnPhong" definiert, werden Dutzende von Berechnungen in Ihren Shader eingegeben, um Blinn-Phong-Beleuchtung zu kalkulieren. Den Code, den diese Lighting-Defines hinzufügen, finden Sie in der lighting.cginc-Datei in Ihrem Unity-Installationsverzeichnis.Weitere Informationen finden Sie in der Dokumentation "Lighting-Modelle in Oberflächenshadern anpassen".

Shader-Profiling

Unitys Frame-Debugger lässt Sie das Abspielen eines Spiels bei einem bestimmten Frame stoppen, um die einzelnen Drawcalls zu sehen, die zum Rendern dieses Frames verwendet werden. Neben der Auflistung der Drawcalls lässt Sie der Debugger diese Schritt für Schritt durchgehen, sodass Sie in allen Einzelheiten sehen können, wie die Szene aus den graphischen Elementen aufgebaut ist.

Unity-shader-optimization-frame-debugger

Unitys Frame-Debugger

Ab Version 2017.1 sind auch Informationen zum Geometrie-Batching sowie Feedback darüber enthalten, warum ein bestimmtes Mesh kein Batching durchführt, obwohl es dafür eingestellt ist.

Weiterhin gibt es auf entsprechender Hardware sehr gute externe Tools für das Shader-Bugging:

  1. Für iOS und Mac OS: Xcode verfügt über einen großartigen integrierten Frame-Profiler, der viele praktische Optionen beinhaltet: die Erfassung des gesamten Speicherplatzes, den die GPU für einen bestimmten Frame braucht; camera.render, um ins Herz des Drawing-Codes vorzudringen; "Drill Down", um eine verschachtelte Hierarchie-Ansicht anzuzeigen und den FPS-Tab, der Ihnen zeigt, wie jeder Shader die Gesamt-Renderingzeit beeinflusst.

    Unity-shader-optimization-xcode_profiler

    Xcodes Frame-Profiler.

  2. Auf PC oder Mac sind die RenderDoc- und Intel GPA-Tools recht ausführlich und haben mit die höchste Hardware-Kompatibilität.

  3. Wenn Sie einen bestimmten Hardware-Target wegen der Performance oder Falschausgaben debuggen, wie z. B. ein mobiles Chipset wie ARM Mali oder PS4, Xbox, Nintendo Switch usw., nutzen Sie IMMER den Frame-Debugger des Herstellers (manchmal auch "Frame Profiler" oder "Frame Analyzer" genannt). Deren Tools haben fast immer die präzisesten Daten für das entsprechende Chipset und im Vergleich zu den oben genannten allgemeinen Tools wahrscheinlich erweiterte Datensätze.

Sieben wesentliche Shader-Optimierungen

Auf Pro-Frame-Basis wird üblicherweise viel mehr Arbeit von Ihrem Shadercode als von Ihrem Spielcode geleistet. Probieren Sie diese Optimierungen aus, um Ihre Performance/FPS-Rate geschmeidig zu halten.

  1. Nutzen Sie weniger nicht-konstante Rechnungen. Verwenden Sie Konstanten oder "Dynamic Uniforms" (z. B. x=4/33, x=4xsin(24)).
  2. Multiplizieren Sie Skalarwerte (float, int) vor Vektorwerten (float3, float4).
  3. Vermeiden Sie nach Möglichkeit "Discard"-Anweisungen, auch für Alphatest (trifft hauptsächlich auf Mobilgeräte zu). Achten Sie auf Overdraws.
  4. Belassen Sie Ihre Berechnungen möglichst auf einem Vertexshader.
  5. Legen Sie nach Möglichkeit eine Write Mask für eine Vektoroperation fest (wenn diese nicht alle Komponenten des Ergebnisses verwendet).
  6. Vermeiden Sie Branching, das auf dynamischen Werten/Non-Uniforms basiert (if-else, loops).
  7. Überprüfen Sie die Auswirkungen von Abläufen (wie discard(), floor() usw.) auf Ihr Renderer-Modell (OpenGL 2, OpenGL 3, OpenGL ES usw.) und Ihre Hardware.
Weitere Ressourcen

Shader-Dokumentationen und Tutorials:

Wir wollen es wissen! Haben Ihnen diese Inhalte gefallen?

Ja, weiter so. Na ja. Könnte besser sein.
Alles klar

Wir verwenden Cookies, damit wir Ihnen die beste Nutzererfahrung auf unserer Website bieten können. Weitere Informationen erhalten Sie in unserer Cookie-Richtlinie.