Engine & platform

Profiling in Unity 2021 LTS: Was, wann und wie

THOMAS KROGH-JACOBSEN / UNITY TECHNOLOGIESProduct Marketing Core Tech
Jun 1, 2022|23 Min.
Profiling in Unity 2021 LTS: Was, wann und wie
Diese Website wurde aus praktischen Gründen für Sie maschinell übersetzt. Die Richtigkeit und Zuverlässigkeit des übersetzten Inhalts kann von uns nicht gewährleistet werden. Sollten Sie Zweifel an der Richtigkeit des übersetzten Inhalts haben, schauen Sie sich bitte die offizielle englische Version der Website an.

Die Entwicklung von Fachwissen im Umgang mit den Profiling-Tools von Unity ist eine der nützlichsten Fähigkeiten, die Sie zu Ihrem Werkzeugkasten für die Spieleentwicklung hinzufügen können. Eine gründliche Profilerstellung kann die Leistung Ihres Spiels erheblich steigern. Wir möchten Ihnen daher mit den wichtigsten Tipps aus unserem neu veröffentlichten E-Book, dem ultimativen Leitfaden zur Profilerstellung von Unity-Spielen, den Einstieg erleichtern.

Jeder Spieleentwickler weiß, dass eine reibungslose Leistung für ein fesselndes Spielerlebnis unerlässlich ist - und um das zu erreichen, müssen Sie ein Profil für Ihr Spiel erstellen. Sie müssen nicht nur wissen, welche Instrumente Sie wie einsetzen, sondern auch, wann Sie sie einsetzen.

Unser druckfrischer, über 70-seitiger Leitfaden für fortgeschrittenes Profiling wurde in Zusammenarbeit mit internen und externen Experten erstellt. Es enthält Ratschläge und Wissen darüber, wie eine Anwendung in Unity profiliert und Leistungsengpässe identifiziert werden können, sowie weitere Best Practices.

Schauen wir uns einige hilfreiche Tipps aus dem E-Book an.

Wann ein Profil erstellen

Profiling ist wie Detektivarbeit, bei der Sie herausfinden, warum die Leistung Ihrer Anwendung nachlässt oder warum der Code zu viel Speicher zuweist.

Profiling-Tools helfen Ihnen dabei zu verstehen, was in Ihrem Unity-Projekt "unter der Haube" vor sich geht. Aber warten Sie nicht, bis sich signifikante Leistungsprobleme zeigen, bevor Sie zu Ihrem Detektivwerkzeugkasten greifen.

Der beste Nutzen aus der Profilerstellung ergibt sich, wenn Sie zu einem frühen Zeitpunkt im Entwicklungszyklus Ihres Projekts planen, und nicht erst kurz vor der Auslieferung Ihres Spiels. Es ist ein kontinuierlicher, proaktiver und iterativer Prozess. Durch frühzeitige und häufige Profilerstellung können Sie und Ihr Team die "Leistungssignatur" für das Projekt verstehen und festlegen. Wenn zum Beispiel die Leistung nachlässt, können Sie leicht erkennen, wenn etwas schief läuft, und das Problem schnell beheben.

Sie können auch Vorher-Nachher-Leistungsvergleiche in kleineren Einheiten durchführen, indem Sie ein einfaches Drei-Punkte-Verfahren anwenden: Erstellen Sie zunächst ein Basisprofil, bevor Sie größere Änderungen vornehmen. Als Nächstes wird ein Profil während der Entwicklung erstellt, um die Leistung und die Budgetierung zu verfolgen, und schließlich wird ein Profil erstellt, nachdem die Änderungen umgesetzt wurden, um zu überprüfen, ob sie die gewünschte Wirkung hatten.

Sie sollten versuchen, ein Profil eines Entwicklungs-Builds Ihres Spiels zu erstellen, anstatt es aus dem Unity-Editor heraus zu profilieren. Hierfür gibt es zwei Gründe:

Die Daten zur Leistung und Speichernutzung von eigenständigen Entwicklungs-Builds sind viel genauer als die Ergebnisse der Profilierung eines Spiels im Editor. Dies ist darauf zurückzuführen, dass das Profiler-Fenster Daten aus dem Editor selbst aufzeichnet, was die Ergebnisse verfälschen kann.

Einige Leistungsprobleme treten erst auf, wenn das Spiel auf der Zielhardware oder dem Zielbetriebssystem läuft, was Ihnen entgeht, wenn Sie das Profil ausschließlich im Editor erstellen.

Die Werkzeuge, die Ihnen zur Verfügung stehen

Die genauesten Profilergebnisse erhält man, wenn man Builds auf den Zielgeräten ausführt und profiliert und plattformspezifische Tools einsetzt, um die Hardwareeigenschaften der jeweiligen Zielplattform zu untersuchen.

Während Unity mit einer Reihe von kostenlosen und leistungsstarken Profiling-Tools zur Analyse und Optimierung Ihres Codes sowohl im Editor als auch auf der Hardware ausgeliefert wird, gibt es auch mehrere großartige native Profiling-Tools, die für jede Plattform entwickelt wurden, wie zum Beispiel die von Arm, Apple, Sony und Microsoft. Die Verwendung einer Kombination bietet einen ganzheitlicheren Überblick über die Anwendungsleistung auf allen Zielgeräten.

Einen vollständigen Überblick über die verfügbaren Tools finden Sie auf der Seite mit den Profiling-Tools hier.

Die Profiling-Tools von Unity sind im Editor und im Paketmanager verfügbar. Jedes Tool ist auf die Erstellung von Profilen für verschiedene Teile des Prozesses spezialisiert (ein ganzheitlicher "Summe aller Teile"-Workflow). Machen Sie sich mit den folgenden Profilen vertraut, damit sie zu Ihrem täglichen Werkzeugkasten gehören:

  • Der Unity Profiler ist der Ort, an dem Sie beginnen und die meiste Zeit verbringen sollten. Er misst die Leistung des Unity-Editors, Ihrer Anwendung im Spielmodus und stellt eine Verbindung zu dem Gerät her, auf dem Ihre Anwendung im Entwicklungsmodus läuft. Der Unity Profiler sammelt und zeigt Daten über die Leistung Ihrer Anwendung an, z. B. wie viel CPU-Zeit für verschiedene Aufgaben verwendet wird, von Audio und Physik bis hin zu Rendering und Animation. Schauen Sie sich diesen Kurs zur Profilerstellung an, um damit zu beginnen.
  • Der Memory Profiler bietet eine eingehende Analyse der Speicherleistung, um festzustellen, wo Sie die Speichernutzung in Teilen Ihres Projekts und des Editors reduzieren können. Der Memory Profiler befindet sich derzeit in der Vorschau, wird aber voraussichtlich in Unity 2022 LTS verifiziert werden.
  • Der Profile Analyzer aggregiert und visualisiert sowohl Frame- als auch Markerdaten aus einer Reihe von Unity Profiler-Frames, um deren Verhalten über viele Frames hinweg zu untersuchen (und ergänzt damit die bereits im Unity Profiler verfügbare Einzelbildanalyse). Außerdem können Sie zwei Profildatensätze vergleichen, um festzustellen, wie sich Ihre Änderungen auf die Leistung der Anwendung auswirken.
  • Mit dem Frame-Debugger können Sie die Wiedergabe eines laufenden Spiels bei einem bestimmten Frame einfrieren und dann die einzelnen Zeichenaufrufe anzeigen, die zum Rendern dieses Frames verwendet werden. Der Debugger listet nicht nur die Zeichenaufrufe auf, sondern lässt Sie auch einen nach dem anderen durchlaufen, so dass Sie sehen können, wie die Szene aus ihren grafischen Elementen aufgebaut ist.
  • Das Paket Profiling Core bietet APIs zum Hinzufügen von Kontextinformationen zu Unity Profiler-Aufnahmen.
Wie man die Tools benutzt

Steve McGreal, ein leitender Unity-Ingenieur und Mitautor unseres E-Books über fortgeschrittene Profilerstellung, hat den folgenden Überblick zusammengestellt. Sie können es gerne als Referenzblatt verwenden.

Eine ausführliche Erläuterung zur Verwendung der Tools finden Sie im E-Book. Dieses Flussdiagramm veranschaulicht die drei wichtigsten Beobachtungen, die Sie bei Ihrem Arbeitsablauf berücksichtigen sollten:

Flussdiagramm zur Verwendung des Profilers, um festzustellen, worauf sich die Optimierungsbemühungen konzentrieren sollen
Wie man den Profiler nutzt, um festzustellen, worauf man sich bei der Optimierung konzentrieren sollte

Laden Sie die druckbare PDF-Version dieser Tabelle hier herunter. Weitere Informationen finden Sie in den verlinkten Ressourcen zur Verwendung der einzelnen Profiling-Tools am Ende dieses Beitrags.

Liegt Ihr Budget im Rahmen?

Eine gängige Methode, mit der Gamer die Leistung messen, ist die Framerate, also die Bilder pro Sekunde. Es wird jedoch empfohlen, stattdessen die Rahmenzeit in Millisekunden zu verwenden.

Sie könnten beispielsweise ein Spiel haben, das zur Laufzeit 59 Bilder in 0,75 Sekunden rendert, wobei das nächste Bild 0,25 Sekunden zum Rendern benötigt. Die durchschnittliche Bildwiederholrate von 60 fps klingt gut, aber in der Realität werden die Spieler einen Stottereffekt bemerken, da das letzte Bild eine Viertelsekunde zum Rendern benötigt.

Streben Sie bei der Profilierung und Optimierung Ihres Spiels ein bestimmtes Zeitbudget pro Frame an, da dies für ein reibungsloses und konsistentes Spielerlebnis entscheidend ist. Jedes Bild hat ein Zeitbudget, das sich nach den angestrebten fps richtet. Eine Anwendung, die 30 Bilder pro Sekunde anstrebt, sollte immer weniger als 33,33 ms pro Bild benötigen (1000 ms / 30 Bilder pro Sekunde). Bei einem Zielwert von 60 Bildern pro Sekunde verbleiben 16,66 ms pro Bild.

Die meisten modernen Konsolen- und PC-Spiele streben eine Bildrate von 60 fps oder mehr an. Bei VR-Spielen ist eine regelmäßig hohe Bildwiederholrate eigentlich wichtiger, da sie bei den Spielern Übelkeit oder Unbehagen auslösen kann. Mobile Spiele können auch ein begrenztes Frame-Budget erfordern, um eine Überhitzung der Geräte, auf denen sie laufen, zu vermeiden. Ein mobiles Spiel könnte beispielsweise 30 fps mit einem Frame-Budget von nur 21-22 ms anstreben, damit CPU und GPU zwischen den Frames abkühlen können.

Verwenden Sie den Unity Profiler, um festzustellen, ob Sie sich im Rahmen des Budgets bewegen. Unten sehen Sie ein Bild eines Profiling-Captures aus einem Unity-Mobilspiel mit laufender Profilierung und Optimierung. Das Spiel erreicht 60 fps auf hochauflösenden Mobiltelefonen und 30 fps auf Handys mit mittlerer/geringer Auflösung, wie dem hier abgebildeten:

Profiler Framerate-Schnappschuss
Profiler Framerate-Schnappschuss

Dieses Spiel läuft bequem innerhalb des für 30 fps erforderlichen Frame-Budgets von ~22 ms ohne Überhitzung. Beachten Sie die WaitForTargetfps, die die Zeit des Hauptthreads auffüllen, bis VSync und die grauen Leerlaufzeiten im Render- und Worker-Thread. Beobachten Sie außerdem das VBlank-Intervall, indem Sie sich die Endzeiten von Gfx ansehen. Wenn Sie ein Bild nach dem anderen präsentieren, wird eine Zeitskala im Bereich der Zeitleiste oder auf dem Zeitlineal oben erstellt, um von einem dieser Bilder zum nächsten zu messen.

Wenn Sie sich innerhalb des Rahmenbudgets befinden, einschließlich aller Anpassungen, die Sie vorgenommen haben, um den Akkuverbrauch und die thermische Drosselung zu berücksichtigen, haben Sie die Leistungsprofilerstellung bis zum nächsten Mal erfolgreich abgeschlossen - herzlichen Glückwunsch! Schauen Sie sich nun die Speichernutzung an, um zu sehen, ob sie ebenfalls im Rahmen des Budgets liegt.

Wenn Ihr Spiel jedoch nicht innerhalb des Frame-Budgets liegt, besteht der nächste Schritt darin, den Engpass zu ermitteln. Mit anderen Worten: Finden Sie heraus, ob die CPU oder die GPU am längsten braucht. Wenn es die CPU ist, ermitteln Sie, welcher Thread am stärksten ausgelastet ist - darin liegt der Engpass.

Der Sinn der Profilerstellung besteht darin, Engpässe zu identifizieren, die optimiert werden können. Wenn man sich auf Vermutungen verlässt, kann es passieren, dass man Teile des Spiels optimiert, die keine Engpässe darstellen, was zu geringen oder gar keinen Verbesserungen führt. Einige "Optimierungen" können die Gesamtleistung Ihres Spiels sogar verschlechtern.

Sind Sie an den Hauptthread der CPU gebunden?

Der Hauptthread ist der Ort, an dem die gesamte Spiellogik und die Skripte standardmäßig ihre Arbeit verrichten; hier finden Funktionen und Systeme wie Physik, Animation, Benutzeroberfläche und Rendering statt.

Die folgende Abbildung zeigt ein Beispiel dafür, wie ein Projekt aussieht, das an den Hauptthread gebunden ist:

Erfassen von einem Projekt, das an den Hauptthread gebunden ist

Obwohl die Render- und Worker-Threads wie im vorherigen Beispiel aussehen, das innerhalb des Frame-Budgets liegt, ist der Hauptthread hier eindeutig während des gesamten Frames mit Arbeit beschäftigt. Selbst wenn man den geringen Profiler-Overhead am Ende des Frames berücksichtigt, ist der Haupt-Thread über 45 ms lang beschäftigt, was bedeutet, dass dieses Projekt Frame-Raten von weniger als 22 fps erreicht. Es gibt keine Markierung, die anzeigt, dass der Haupt-Thread untätig auf VSync wartet; er ist den ganzen Frame lang beschäftigt.

Die nächste Phase der Untersuchung besteht darin, die Teile des Rahmens zu ermitteln, die am längsten brauchen, und die Ursachen dafür festzustellen. Verwenden Sie sowohl den Unity Profiler als auch den Profile Analyzer, um die größten Kosten zu bewerten und zu beseitigen. Häufige Engpässe ergeben sich aus der Physik, nicht optimierten Skripten, dem Garbage Collector (GC), Animationen, Kameras und der Benutzeroberfläche. Wenn die Ursache des Problems nicht sofort erkennbar ist, versuchen Sie, Deep Profiling und Call Stacks zu aktivieren oder einen nativen CPU-Profiler zu verwenden.

In unserem 95-seitigen Leitfaden zur Leistungsoptimierung haben wir eine Liste der häufigsten Fallstricke zusammengestellt, auf die Sie stoßen und auf die Sie sich vorbereiten können.

Sind Sie an den CPU-Rendering-Thread gebunden?

Während des Rendering-Prozesses untersucht der Haupt-Thread die Szene und führt Camera Culling, Depth Sorting und Draw Call Batching durch, um eine Liste der zu rendernden Objekte zu erstellen. Diese Liste wird an den Render-Thread weitergegeben, der sie von der internen plattformunabhängigen Darstellung von Unity in die Grafik-API-Aufrufe übersetzt, die erforderlich sind, um die GPU auf einer bestimmten Plattform zu instruieren.

In der unten gezeigten Profiler-Aufnahme können Sie sehen, dass der Haupt-Thread auf den Render-Thread wartet, bevor er mit dem Rendering des aktuellen Frames beginnt, wie durch den Gfx.WaitForPresentOnGfxThreadmarker angezeigt wird.

Ein Rendering-Thread-gebundenes Szenario mit Profiler
Ein Rendering-Thread-gebundenes Szenario mit Profiler

Der Render-Thread sendet immer noch Zeichenaufrufe vom vorherigen Frame, ist aber nicht bereit, neue Zeichenaufrufe vom Hauptthread zu akzeptieren. Der Render-Thread verbringt Zeit in Camera.Render.

Das Rendering-Profiler-Modul gibt einen Überblick über die Anzahl der Zeichnungsaufrufe und SetPass-Aufrufe für jeden Frame. Das beste Werkzeug, um zu untersuchen, welche Zeichnungsaufrufe Ihre Render-Thread-Probleme an die GPU weiterleiten, ist der Frame Debugger. Häufige Ursachen für Render-Thread-Engpässe sind u. a. eine schlechte Stapelverarbeitung von Zeichenaufrufen, mehrere aktive Kameras in der Szene und ineffizientes Kamera-Culling.

Sind Sie an CPU-Arbeitsthreads gebunden?

Die Bindung an CPU-Threads, abgesehen von den Haupt- oder Render-Threads, ist kein häufiges Problem, kann aber in Projekten auftreten, die den Data-Oriented Technology Stack (DOTS) verwenden - insbesondere, wenn die Arbeit vom Haupt-Thread in Worker-Threads verschoben wird, die das C# Job System verwenden.

Hier ist eine Aufnahme aus dem Play-Modus im Editor, die ein DOTS-Projekt mit einer Partikel-Fluid-Simulation auf der CPU zeigt:

Ein DOTS-gestütztes Projekt mit hohem Simulationsanteil, das durch Worker-Threads gebunden ist

Wie Sie sehen können, sind die Worker-Threads dicht mit Aufträgen gefüllt. Dies deutet darauf hin, dass ein großer Teil der Arbeit vom Haupt-Thread abgezogen wird. Beachten Sie, dass die Frame-Zeit von 48,14 ms und die graue WaitForJobGroupID-Markierung von 35,57 ms auf dem Haupt-Thread darauf hinweisen, dass die Worker-Threads mehr Arbeit verrichten, als realistischerweise innerhalb eines einzelnen Frames auf dieser CPU erreicht werden kann.

WaitForJobGroupID zeigt, dass der Hauptthread Aufträge geplant hat, die asynchron auf Worker-Threads ausgeführt werden sollen, dass er aber die Ergebnisse dieser Aufträge benötigt, bevor die Worker-Threads ihre Ausführung beendet haben. Die blauen Profiler-Markierungen unter WaitForJobGroupID zeigen an, dass der Haupt-Thread Aufträge ausführt, während er wartet, um zu versuchen, die Aufträge schneller zu beenden.

Die Aufträge in Ihrem Projekt sind möglicherweise nicht so parallelisiert wie in diesem Beispiel. Vielleicht haben Sie nur einen langen Auftrag, der in einem einzigen Worker-Thread läuft. Das ist in Ordnung, solange die Zeit zwischen dem geplanten Auftrag und dem Zeitpunkt, zu dem er abgeschlossen werden muss, lang genug ist, um den Auftrag auszuführen. Wenn dies nicht der Fall ist, wird der Haupt-Thread blockiert, während er auf die Fertigstellung des Auftrags wartet, wie im obigen Screenshot zu sehen ist.

Sie können die Funktion " Ablaufereignisse" in der Ansicht "Zeitleiste" des Moduls "CPU-Nutzungsprofil" verwenden, um zu sehen, wann Aufträge eingeplant werden und wann ihre Ergebnisse vom Hauptthread erwartet werden. Weitere Informationen zum Schreiben von effizientem DOTS-Code finden Sie in unseren DOTS-Best Practices.

Sind Sie GPU-gebunden?

Möglicherweise stellen Sie fest, dass Ihr Haupt-Thread Zeit damit verbringt, auf den Render-Thread zu warten (was durch Profiler-Markierungen wie Gfx.WaitForPresentOnGfxThread angezeigt wird). Gleichzeitig kann Ihr Rendering-Thread jedoch Markierungen wie Gfx.PresentFrame oder <GraphicsAPIName>.WaitForLastPresent anzeigen. Dies bedeutet, dass Ihre Anwendung GPU-gebunden ist. Sie müssen daher Ihre Optimierungsbemühungen auf Engpässe bei der GPU konzentrieren, um die Gesamtleistung zu verbessern.

Die folgende Aufnahme wurde mit einem Samsung Galaxy S7 unter Verwendung der Vulkan-Grafik-API gemacht. Obwohl ein Teil der in Gfx.PresentFrame verbrachten Zeit in diesem Beispiel mit dem Warten auf VSync zusammenhängen könnte, beweist die extreme Länge dieses Profiler-Markers, dass die meiste Zeit damit verbracht wird, darauf zu warten, dass die GPU das Rendering des vorherigen Frames beendet.

Eine Aufnahme aus einem GPU-gebundenen Handyspiel
Eine Aufnahme aus einem GPU-gebundenen Handyspiel

Wenn Ihre Anwendung GPU-gebunden zu sein scheint, können Sie den Frame Debugger verwenden, um einen schnellen Überblick über die Zeichnungsaufrufe zu erhalten, die an die GPU gesendet werden. Dieses Tool kann jedoch keine spezifischen GPU-Timing-Informationen liefern. Sie zeigt nur, wie die Szene aufgebaut ist.

Um die Ursache von GPU-Engpässen sorgfältig zu untersuchen, sollten Sie eine GPU-Aufzeichnung mit einem geeigneten GPU-Profiler prüfen. Welches Werkzeug Sie verwenden, hängt von der Zielhardware und der gewählten Grafik-API ab.

Häufige Ursachen für eine schlechte GPU-Leistung sind ineffiziente Shader, teure Post-Processing-Effekte, transparentes Overdraw (oft von Partikeleffekten oder der Benutzeroberfläche), große oder unkomprimierte Texturen, Meshes mit übermäßig vielen Polygonen und übermäßige Ausgabeauflösungen (z. B. Rendering mit 4K).

Holen Sie sich das kostenlose E-Book
Werbung für ein E-Book zur Profilerstellung
Das E-Book "Ultimative Anleitung zur Profilierung von Unity-Spielen"

Leistungsoptimierung und Profilerstellung sind wichtige Themen. Wenn Sie nach weiteren Informationen suchen, lesen Sie unser kürzlich veröffentlichtes E-Book, Ultimative Anleitung zur Profilierung von Unity-Spielen. Sie erhalten mehr als 80 Seiten mit Tipps und Tricks, die in Zusammenarbeit mit mehreren Experten erstellt wurden, u. a. mit den Mitarbeitern unseres Teams für integrierte Supportdienste.

Einige dieser Experten haben auch an der Erstellung unseres 100-seitigen Leitfadens zur Leistungsoptimierung für Mobilgeräte und PC/Konsole mitgewirkt - vollgepackt mit umsetzbaren Tipps, wie man Engpässe von vornherein vermeiden kann. Weitere Ressourcen finden Sie in unseren früheren Blog-Beiträgen zu Physik-, UI- und Audioeinstellungen, Grafiken und Assets auf Mobilgeräten und Konsolen sowie Speicher- und Code-Architektur.

Wenn Sie wissen möchten, wie Ihr Team direkten Zugang zu Ingenieuren, Expertenrat und Projektbegleitung erhalten kann, sehen Sie sich hier die Erfolgspläne von Unity an.

Webinar zur Profilerstellung
3D-Modell mit Roboterfigur auf der rechten Seite

Schalten Sie ein zu unserem neuen Webinar "Ultimative Tipps zur Profilerstellung" mit Experten von SYBO Games, Arm und Unity, die Ihnen Tipps geben, wie Sie häufige Performance-Probleme in mobilen Spielen mit Hilfe von Unity- und nativen Profilerstellungs-Tools identifizieren können.

Dieses Webinar behandelt folgende Themen:

  • Wichtige Überlegungen zur Erstellung von schlankem, leistungsfähigem Code und optimierter Speichernutzung für reibungslose Leistung auf Low- und High-End-Geräten
  • Wärmesteuerung zur Schonung wertvoller Batteriezyklen bei mobilen Geräten
  • Profiling-Strategien in allen Phasen der Spielentwicklung und wie man sie testet, um eine solide Methodik aufzubauen
  • Expertenwissen zur Android-Profilerstellung

Nehmen Sie am 14. Juni 2022 um 11:00 Uhr ET / 8:00 Uhr PT an unserem Rundtischgespräch und der Live-Fragerunde teil.

Haben Sie nicht gefunden, wonach Sie gesucht haben?

Wir möchten Ihnen helfen, das Beste aus Ihren Unity-Anwendungen herauszuholen. Wenn es ein Optimierungsthema gibt, das Sie gerne weiter erforschen möchten, lassen Sie es uns bitte im Forum wissen. Wir würden auch gerne erfahren, welche Formate Sie bevorzugen, damit wir unsere E-Books und andere Lernmaterialien verbessern können.