Holen Sie sich diese hilfreichen Tipps zum fortgeschrittenen Profiling

THOMAS KROGH-JACOBSEN / UNITY TECHNOLOGIESSenior Technical Content Marketing Manager
Aug 26, 2022|30 Min.
Holen Sie sich diese hilfreichen Tipps zum fortgeschrittenen Profiling
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.

Im Juni veranstalteten wir ein Webinar mit Experten von Arm, dem Unity Studio Productions Team und SYBO Games, dem Schöpfer von Subway Surfers. Die resultierende Diskussionsrunde konzentrierte sich auf Profilierungstipps und -strategien für mobile Spiele, die geschäftlichen Auswirkungen von schlechter Leistung und wie SYBO ein erfolgreiches mobiles Spiel mit bisher 3 Milliarden Downloads veröffentlicht hat.

Lass uns einige der Nachfragen behandeln, die wir während des Webinars nicht besprechen konnten. Du kannst auch die vollständige Aufzeichnung ansehen.

Tipps zur Verwendung des Unity-Profilierungsfahrplans

Wir hören viel über den Unity Profiler in Bezug auf die CPU-Profilierung, aber nicht so viel über den Profil Analyzer (verfügbar als Unity-Paket). Gibt es Pläne, ihn zu verbessern oder in das Kern-Profiler-Toolset zu integrieren?

Es gibt keine unmittelbaren Pläne, den Profil Analyzer in den Kern-Editor zu integrieren, aber das könnte sich ändern, während sich unsere Profilierungswerkzeuge weiterentwickeln.

Die Übersicht des Hauptfensters des Profil Analyzers
Die Übersicht des Hauptfensters des Profil Analyzers

Hat Unity Pläne, eine Option hinzuzufügen, damit das GPU Usage Profiler-Modul in Prozenten angezeigt wird, wie es in Millisekunden der Fall ist?

Das ist eine großartige Idee, und während wir zum Zeitpunkt dieses Blogbeitrags nicht ja oder nein sagen können, ist es eine Anfrage, die mit unseren F&E-Teams für eine mögliche zukünftige Berücksichtigung geteilt wurde.

Hast du Pläne, um „Application Not Responding“ (ANR)-Fehler zu beheben, die vom Google Play Store gemeldet werden und keinen Stack-Trace enthalten?

Obwohl wir momentan keine spezifischen Pläne haben, ANR ohne Stack-Trace zu verfolgen, werden wir es für den zukünftigen Fahrplan in Betracht ziehen.

Wie kann ich mein Feedback teilen, um die zukünftige Entwicklung von Unitys Profilierungswerkzeugen zu beeinflussen?

Du kannst kommende Funktionen verfolgen und Feedback über unser Produktboard und Foren teilen. Wir führen auch eine Umfrage durch, um mehr über die Erfahrungen unserer Kunden mit den Profilierungswerkzeugen zu erfahren. Wenn du Profilierungswerkzeuge zuvor verwendet hast (entweder täglich oder nur einmal) oder an einem Projekt arbeitest, das Optimierung erfordert, würden wir uns über dein Feedback freuen. Die Umfrage ist so gestaltet, dass sie nicht länger als 5–10 Minuten dauert.

Durch die Teilnahme hast du auch die Möglichkeit, an einem Folgeinterview teilzunehmen, um weiteres Feedback direkt mit dem Entwicklungsteam zu teilen, einschließlich der Möglichkeit, potenzielle Prototypen neuer Funktionen zu diskutieren.

Tipps zur Zielsetzung auf Low-End-Geräte

Gibt es eine gute Regel, um zu bestimmen, was als ein tragfähiges Low-End-Gerät gilt?

Eine Faustregel, die wir von vielen Unity-Spieleentwicklern hören, ist, Geräte anzusprechen, die zum Zeitpunkt der Veröffentlichung Ihres Spiels fünf Jahre alt sind, da dies hilft, die größte Benutzerbasis sicherzustellen. Aber wir sehen auch, dass Teams ihren Veröffentlichungszeitraum auf Geräte reduzieren, die nur drei Jahre alt sind, wenn sie auf höhere grafische Qualität abzielen. Eine visuell komplexe 3D-Anwendung hat beispielsweise höhere Geräteanforderungen als eine einfache 2D-Anwendung. Dieser Ansatz ermöglicht eine höhere "Min-Spezifikation", reduziert jedoch die Größe der anfänglichen Installationsbasis. Es ist im Wesentlichen eine Geschäftsentscheidung: Wird es mehr kosten, für alte Geräte zu entwickeln und diese zu unterstützen, als das, was Ihr Spiel auf ihnen verdienen wird?

Manchmal diktieren die technischen Anforderungen Ihres Spiels Ihre minimalen Zielvorgaben. Wenn Ihr Spiel große Mengen an Texturspeicher verbraucht, selbst nach der Optimierung, Sie jedoch die Qualität oder Auflösung absolut nicht reduzieren können, schließt das wahrscheinlich die Ausführung auf Telefonen mit unzureichendem Speicher aus. Wenn Ihre Rendering-Lösung Compute-Shader erfordert, schließt das wahrscheinlich Geräte mit Treibern aus, die OpenGL ES 3.1, Metal oder Vulkan nicht unterstützen können.

Es ist eine gute Idee, Marktdaten für Ihre priorisierte Zielgruppe zu betrachten. Zum Beispiel können die Spezifikationen mobiler Geräte zwischen Ländern und Regionen stark variieren. Denken Sie daran, einige Ziel-"Budgets" zu definieren, damit Benchmarking-Ziele für das, was akzeptabel ist, festgelegt werden, bevor Sie Low-End-Geräte für Tests auswählen.

Für Live-Service-Spiele, die über Jahre laufen werden, müssen Sie deren Kompatibilität kontinuierlich überwachen und im Laufe der Zeit anpassen, basierend auf Ihrer tatsächlichen Benutzerbasis und den aktuellen Geräten auf dem Markt.

Das Memory Profiler-Modul ermöglicht es Ihnen, durch Assets und Szenenobjekte zu gehen, um die mit der höchsten Auslastung zu finden.
Das Memory Profiler-Modul ermöglicht es Ihnen, durch Assets und Szenenobjekte zu gehen, um die mit der höchsten Auslastung zu finden.

Reicht es aus, die Leistung ausschließlich auf Low-End-Geräten zu testen, um sicherzustellen, dass das Spiel auch auf High-End-Geräten reibungslos läuft?

Es könnte sein, wenn Sie eine einheitliche Arbeitslast auf allen Geräten haben. Sie müssen jedoch weiterhin Variationen über Hardware von verschiedenen Anbietern und/oder Treiberversionen berücksichtigen.

Es ist üblich, dass grafisch anspruchsvolle Spiele verschiedene Stufen der grafischen Treue haben – je höher die visuelle Stufe, desto mehr Ressourcen werden auf fähigen Geräten benötigt. Diese Auswahl der Stufen könnte automatisch sein, aber zunehmend können die Benutzer selbst die Wahl über ein grafisches Einstellungsmenü steuern. Für diesen Entwicklungsstil müssen Sie mindestens ein "Min-Spec"-Zielgerät pro Funktion/Arbeitslaststufe testen, die Ihr Spiel unterstützt.

Wenn Ihr Spiel die Fähigkeiten des Geräts erkennt, auf dem es läuft, und die Grafikausgabe nach Bedarf anpasst, kann es auf leistungsstärkeren Geräten unterschiedlich funktionieren. Stellen Sie also sicher, dass Sie auf einer Reihe von Geräten mit den verschiedenen Qualitätsstufen testen, für die Sie den Titel programmiert haben.

Tipps für die Nutzung von Android-Geräten

Hinweis: In diesem Abschnitt haben wir angegeben, ob der antwortende Experte von Arm oder Unity stammt.

Haben Sie Ratschläge zur Erkennung des Leistungsbereichs eines Geräts, um automatische Qualitätseinstellungen zu unterstützen, insbesondere für mobile Geräte?

Arm: Wir sehen typischerweise, dass Entwickler eine grobe Fähigkeitseinstufung basierend auf CPU- und GPU-Modellen sowie der Anzahl der GPU-Shader-Kerne durchführen. Das ist nie perfekt, aber es ist "ungefähr richtig". Viele Studios sammeln Live-Analysen von bereitgestellten Geräten, damit sie die automatisierte Einstufung mit gerätespezifischen Opt-in/Opt-out ergänzen können, um punktuelle Probleme zu umgehen, bei denen die Fähigkeitseinstufung nicht genau genug ist.

In Bezug auf die vorherige Frage sehen wir einen Trend bei grafisch reichhaltigen Inhalten in mobilen Einstellungen, bei denen Benutzer wählen können, ob sie Effekte ein- oder ausschalten möchten, wodurch sie Leistungsentscheidungen treffen können, die ihren Vorlieben entsprechen.

Unity: Der Gerätespeicher und die Bildschirmauflösung sind ebenfalls wichtige Faktoren bei der Auswahl von Qualitätseinstellungen. In Bezug auf Texturen sollten Entwickler sich bewusst sein, dass Render-Texturen, die von Effekten oder der Nachbearbeitung verwendet werden, auf Geräten mit hochauflösenden Bildschirmen, aber ohne viel Speicher, um dies auszugleichen, problematisch werden können.

Angesichts der Vielzahl von verfügbaren Konfigurationen (CPU, GPU, SOC, Speicher, mobil, Desktop, Konsole usw.), können Sie einen Weg vorschlagen, um Geräte zu kategorisieren, um die Anzahl der Stufen zu reduzieren, für die Sie optimieren müssen?

Arm: Die Anzahl der Stufen, für die Ihr Team optimiert, ist wirklich eine Design- und Geschäftsentscheidung und sollte darauf basieren, wie wichtig es ist, die visuelle Qualität für das Wertversprechen des Spiels zu pushen. Für einige Genres könnte es überhaupt keine Rolle spielen, aber für andere werden die Benutzer hohe Erwartungen an die visuelle Treue haben.

Unterscheidet sich die Texturspeichergrenze zwischen Modellen und Marken von Android-Geräten, die die gleiche Menge an Gesamtsystemspeicher haben?

Arm: In einer ersten Näherung würden wir erwarten, dass die gesamte Menge an Texturspeicher zwischen Anbietern und Hardwaregenerationen ähnlich ist. Es wird geringfügige Unterschiede geben, die durch den Speicherlayout und die Ausrichtungsbeschränkungen verursacht werden, sodass es nicht genau gleich sein wird.

Ist es die CPU- oder GPU-Nutzung, die am meisten zur Überhitzung von mobilen Geräten beiträgt?

Arm: Es hängt ganz vom Inhalt ab. Die CPU, GPU oder der DRAM können ein High-End-Gerät einzeln überhitzen, wenn sie stark genug beansprucht werden, selbst wenn man die anderen beiden völlig ignoriert. Das genaue Gleichgewicht variiert je nach der Arbeitslast, die Sie ausführen.

Welche Tipps können Sie für das Profiling auf Geräten geben, die eine thermische Drosselung haben? Welchen Spielraum würden Sie anstreben, um eine thermische Drosselung zu vermeiden (d.h. 20 ms anstelle von 33 ms anstreben)?

ARM: Die Optimierung der Frame-Zeit kann auf Android irreführend sein, da Geräte ständig die Frequenz anpassen, um den Energieverbrauch zu optimieren, wodurch die Frame-Zeit allein ein unvollständiges Maß ist. Bevorzugen Sie es, die CPU- und GPU-Zyklen pro Frame sowie die GPU-Speicherbandbreite pro Frame zu überwachen, um einen Wert zu erhalten, der unabhängig von der Frequenz ist. Das Zyklusziel, das Sie benötigen, hängt vom Chipdesign jedes Geräts ab, daher müssen Sie experimentieren.

Jede Optimierung hilft, wenn es darum geht, den Stromverbrauch zu verwalten, selbst wenn sie die Bildrate nicht direkt verbessert. Zum Beispiel wird die Reduzierung der CPU-Zyklen die thermische Last verringern, selbst wenn die CPU nicht der kritische Pfad für Ihr Spiel ist.

Darüber hinaus ist die Optimierung der Speicherbandbreite eine der größten Einsparungen, die Sie erzielen können. Der Zugriff auf DRAM ist um Größenordnungen teurer als der Zugriff auf lokale Daten auf dem Chip, also achten Sie auf Ihr Dreiecksbudget und halten Sie die Datentypen im Speicher so klein wie möglich.

Unity: Um den Einfluss der CPU-Taktfrequenz auf die Leistungskennzahlen zu begrenzen, empfehlen wir, bei einer konstanten Temperatur zu arbeiten. Es gibt ein paar Ansätze, um dies zu tun:

  • Laufen Sie warm: Betreiben Sie das Gerät eine Weile, damit es einen stabilen warmen Zustand erreicht, bevor Sie das Profiling durchführen.
  • Laufen Sie kühl: Lassen Sie das Gerät eine Weile abkühlen, bevor Sie das Profiling durchführen. Diese Strategie kann Verwirrung und Inkonsistenz in Profiling-Sitzungen beseitigen, indem Aufnahmen gemacht werden, die wahrscheinlich nicht thermisch gedrosselt werden. Solche Aufnahmen werden jedoch immer die bestmögliche Leistung darstellen, die ein Benutzer sehen wird, anstatt das, was er tatsächlich nach langen Spielsitzungen sehen könnte. Diese Strategie kann auch die Zeit zwischen den Profiling-Durchläufen verzögern, da zuerst auf die Abkühlzeit gewartet werden muss.

Mit einiger Hardware können Sie die Taktfrequenz für stabilere Leistungsmetriken festlegen. Dies ist jedoch nicht repräsentativ für die meisten Geräte, die Ihre Benutzer verwenden werden, und wird keine genauen realen Leistungsdaten berichten. Im Grunde genommen ist es eine praktische Technik, wenn Sie ein kontinuierliches Integrationssetup verwenden, um im Laufe der Zeit nach Leistungsänderungen in Ihrem Code zu suchen.

Haben Sie Gedanken zu Vulkan vs OpenGL ES 3 auf Android? Vulkan ist in der Regel leistungstechnisch langsamer. Gleichzeitig fehlt vielen Geräten die Unterstützung für verschiedene Funktionen in ES3.

Arm: Neueste Treiber und Engine-Bauten haben die Qualität der verfügbaren Vulkan-Implementierungen erheblich verbessert; daher sollte es für eine gleichwertige Arbeitslast keine Leistungsdifferenz zwischen OpenGL ES und Vulkan geben (wenn doch, lassen Sie es uns bitte wissen). Der Wechsel zu Vulkan gewinnt an Fahrt, und wir erwarten, dass in den nächsten ein oder zwei Jahren mehr Menschen Vulkan standardmäßig wählen werden. Wenn Sie Gegenbeispiele für Bereiche haben, in denen Vulkan nicht gut funktioniert, bitte kontaktieren Sie uns. Wir würden uns freuen, von Ihnen zu hören.

Welche Werkzeuge können wir verwenden, um den Speicherbandbreite (RAM <-> VRAM) zu überwachen?

Arm: Der Streamline Profiler in Arm Mobile Studio kann die Bandbreite zwischen Mali-GPUs und dem externen DRAM (oder Systemspeicher) messen.

Der Streamline Performance Analyzer von Arm enthält eine Fülle von Leistungszählerinformationen, die während Live-Profiling-Sitzungen auf Zielhardware von Arm erfasst werden können.
Der Streamline Performance Analyzer von Arm enthält eine Fülle von Leistungszählerinformationen, die während Live-Profiling-Sitzungen auf Zielhardware von Arm erfasst werden können.

Sollten Sie grafische Assets nach Geräteklassen oder Gerätereauflösungen aufteilen?

Arm: Sie können das beste Ergebnis erzielen, indem Sie Assets neu abstimmen, aber das ist teuer. Beginnen Sie damit, die Auflösung und die Bildrate zu reduzieren oder einige optionale Nachbearbeitungseffekte zu deaktivieren.

Was ist der beste Weg, um Leistungsmetriken aus unserem Entwicklungsbuild aufzuzeichnen?

Arm: Sie können das Performance Advisor-Tool in Arm Mobile Studio verwenden, um automatisch Leistungsmetriken von den Mali-GPUs zu erfassen und zu exportieren, obwohl dies mit einer Einschränkung verbunden ist: Die Erstellung von JSON-Berichten erfordert eine Professional Edition-Lizenz.

Unity: Der Unity Profiler kann verwendet werden, um gängige Rendering-Metriken wie Vertex- und Dreieckszahlen im Rendering-Modul anzuzeigen. Außerdem können Sie benutzerdefinierte Pakete wie System Metrics Mali in Ihr Projekt einfügen, um niedrigstufige Mali GPU-Metriken zum Unity Profiler hinzuzufügen.

Tipps zum Profiling in Unity

Was sind Ihre Empfehlungen für das Profiling von Shader-Code?

Sie benötigen einen GPU-Profiler, um dies zu tun. Der von Ihnen gewählte hängt von Ihrer Zielplattform ab. Zum Beispiel enthält der GPU-Profiler von Xcode auf iOS-Geräten den Shader Profiler, der die Shader-Leistung zeilenweise aufschlüsselt.

Arm Mobile Studio unterstützt Mali Offline Compiler, ein statisches Analysetool für Shader-Code und Compute-Kernels. Dieses Tool bietet einige allgemeine Leistungsschätzungen und Empfehlungen für die Arm Mali GPU-Familie.

Beim Profiling ist die allgemeine Regel, Ihr Spiel oder Ihre App auf dem Zielgerät(e) zu testen. Da die Branche auf mehr Arten von Chipsets (Apple M1, Arm, x86 von Intel, AMD usw.) zusteuert, wie können Entwickler Probleme auf den vielen verschiedenen Hardwarekonfigurationen in angemessener Zeit profilieren und lokalisieren?

Die Verbreitung von Chipsets ist hauptsächlich ein Anliegen auf Desktop-Plattformen. Es gibt eine begrenzte Anzahl von Hardwarearchitekturen, die für Konsolenspiele getestet werden können. Auf Mobilgeräten gibt es die A-Serie von Apple für iOS-Geräte und eine Reihe von Arm- und Qualcomm-Architekturen für Android – aber eine überschaubare Liste repräsentativer mobiler Geräte auszuwählen, ist ziemlich einfach.

Auf dem Desktop ist es komplizierter, da es eine große Auswahl an verfügbaren Chipsets und Architekturen gibt, und der Kauf von Macs und PCs zum Testen kann teuer sein. Unser bester Rat ist, das zu tun, was Sie können. Kein Studio hat unbegrenzt Zeit und Geld für Tests. Wir würden im Allgemeinen keine großen Überraschungen erwarten, wenn man die Leistung zwischen einer Intel x86-CPU und einem ähnlich spezifizierten AMD-Prozessor vergleicht, zum Beispiel. Solange das Spiel auf deinem Mindest-Spezifikationsgerät komfortabel läuft, solltest du dir über andere Geräte relativ sicher sein. Es ist auch sinnvoll, Analysen wie Unity Analytics zu verwenden, um Bildraten, System-Spezifikationen und die Einstellungen der Spieleroptionen aufzuzeichnen, um Hotspots oder problematische Konfigurationen zu identifizieren.

Wir sehen, dass immer mehr Studios zumindest ein gewisses Maß an automatisierten Tests für regelmäßiges Profiling auf Geräten verwenden, wobei Zusammenfassungsstatistiken veröffentlicht werden, die das gesamte Team im Auge behalten kann, um die Leistung über die gesamte Palette der Zielgeräte zu überwachen. Mit gut gestalteten Test-Szenen kann dies normalerweise in einen mechanischen Prozess verwandelt werden, der für die Automatisierung geeignet ist, sodass du keinen erfahrenen technischen Künstler oder QA-Tester benötigst, der Builds manuell durch den Prozess führt.

Siehst du jemals Leistungsprobleme auf High-End-Geräten, die auf Low-End-Geräten nicht auftreten?

Es ist ungewöhnlich, aber wir haben es gesehen. Oft liegt das Problem darin, wie das Projekt konfiguriert ist, zum Beispiel durch die Verwendung von ausgefallenen Shadern und hochauflösenden Texturen auf High-End-Geräten, was zusätzlichen Druck auf die GPU oder den Speicher ausüben kann. Manchmal verwendet ein High-End-Mobilgerät oder eine Konsole einen hochauflösenden Telefonbildschirm oder 4K-TV-Ausgang als Verkaufsargument, hat aber möglicherweise nicht genügend GPU-Leistung oder Speicher, um dieses Versprechen ohne weitere Optimierung einzuhalten.

Wenn du die aktuellen Versionen des C# Job-Systems verwendest, überprüfe, ob es einen Job-Planungs-Overhead gibt, der mit der Anzahl der Arbeits-Threads skaliert, die wiederum mit der Anzahl der CPU-Kerne skaliert. Dies kann dazu führen, dass der Code auf einem 64+ Kern Threadripper™ langsamer läuft als auf einer bescheidenen 4-Kern- oder 8-Kern-CPU. Dieses Problem wird in zukünftigen Versionen von Unity angesprochen, aber versuche in der Zwischenzeit, die Anzahl der Job-Arbeits-Threads durch Setzen von JobsUtility.JobWorkerCount zu begrenzen.

Ein Projekt, das auf dem Data-Oriented Technology Stack basiert, stark auf Simulation setzt und durch Arbeits-Threads gebunden ist.
Ein Projekt, das auf dem Data-Oriented Technology Stack basiert, stark auf Simulation setzt und durch Arbeits-Threads gebunden ist.

Was sind einige Hinweise für die Festlegung eines guten Frame-Budgets?

Die meiste Zeit, wenn wir über Frame-Budgets sprechen, sprechen wir über das gesamte Zeitbudget für den Frame. Du berechnest 1000/Ziel-Bilder pro Sekunde (fps), um dein Frame-Budget zu erhalten: 33,33 ms für 30 fps, 16,66 ms für 60 fps, 8,33 ms für 120 Hz usw. Reduziere diese Zahl um etwa 35%, wenn du mobil bist, um den Chips die Möglichkeit zu geben, sich zwischen jedem Frame abzukühlen. Das Budget aufzuteilen, um spezifische Teilbudgets für verschiedene Funktionen und/oder Systeme zu erhalten, ist wahrscheinlich übertrieben, es sei denn, es handelt sich um Projekte mit sehr spezifischen, vorhersehbaren Systemen oder solche, die stark auf Time Slicing angewiesen sind.

Im Allgemeinen ist Profiling der Prozess, die größten Engpässe zu finden – und damit die größten potenziellen Leistungsgewinne. Anstatt also zu sagen: „Physik benötigt 1,2 ms, wenn das Budget nur 1 ms zulässt“, könntest du dir einen Frame ansehen und sagen: „Rendering benötigt 6 ms, was es zu den größten Kosten für die CPU des Haupt-Threads im Frame macht. Wie können wir das reduzieren?

Es scheint, dass frühes und häufiges Profiling immer noch kein Allgemeinwissen ist. Was sind Ihre Gedanken dazu, warum das der Fall sein könnte?

Ein Spiel zu bauen, zu veröffentlichen, zu bewerben und zu verwalten, ist auf mehreren Ebenen eine schwierige Arbeit. Es wird also immer zahlreiche Prioritäten geben, die um die Aufmerksamkeit eines Entwicklers konkurrieren, und Profiling kann dabei auf der Strecke bleiben. Sie wissen, dass es etwas ist, das sie tun sollten, aber vielleicht sind sie mit den Werkzeugen nicht vertraut und haben nicht das Gefühl, dass sie Zeit zum Lernen haben. Oder sie wissen nicht, wie sie Profiling in ihre Arbeitsabläufe integrieren können, weil sie darauf gedrängt werden, Funktionen abzuschließen, anstatt die Leistung zu optimieren.

So wie bei Bugs und technischer Schulden sind Leistungsprobleme billiger und weniger riskant, sie frühzeitig anzugehen, als später im Entwicklungszyklus eines Projekts. Unser Fokus liegt darauf, Profiling-Tools und -Techniken für Entwickler, die mit ihnen nicht vertraut sind, zu entmystifizieren. Das ist es, was das Profiling e-Book und die dazugehörigen Blogbeiträge und Webinare unterstützen sollen.

Gibt es eine Möglichkeit, bestimmte Methoden von der Instrumentierung auszuschließen oder nur spezifische Methoden beim Deep Profiling im Unity Profiler einzuschließen? Wenn wir viele async/await-Aufgaben verwenden, erstellen wir große Stack-Traces, aber wie können wir vermeiden, sowohl den Client als auch den Profiler beim Deep Profiling zu verlangsamen?

Sie können Allokations-Call-Stacks aktivieren, um die vollständigen Call-Stacks zu sehen, die zu verwalteten Allokationen führen (in der Unity CPU Profiler Timeline-Ansicht als magenta angezeigt). Darüber hinaus können und sollten Sie! – langlaufende Methoden und Prozesse manuell instrumentieren, indem Sie ProfilerMarkers in Ihrem Code streuen. Derzeit gibt es keine Möglichkeit, Deep Profiling automatisch zu aktivieren oder das Profiling in bestimmten Teilen Ihrer Anwendung vollständig zu deaktivieren. Aber das manuelle Hinzufügen von ProfilerMarkers und das Aktivieren von Allokations-Call-Stacks, wenn erforderlich, kann Ihnen helfen, in Problembereiche einzutauchen, ohne auf Deep Profiling zurückgreifen zu müssen.

Seit Unity 2022.2 können Sie auch unser IgnoredByDeepProfilerAttribute verwenden, um zu verhindern, dass der Unity Profiler Methodenaufrufe erfasst. Fügen Sie einfach das IgnoredByDeepProfiler-Attribut zu Klassen, Strukturen und Methoden hinzu.

Fügen Sie ProfilerMarkers hinzu, um tiefere Code-Ebenen zu profilieren, wenn Deep Profiling zu viel Overhead verursacht.
Fügen Sie ProfilerMarkers hinzu, um tiefere Code-Ebenen zu profilieren, wenn Deep Profiling zu viel Overhead verursacht.

Wo finde ich weitere Informationen zum Deep Profiling in Unity?

Das Deep Profiling wird in unserer Profiler-Dokumentation behandelt. Dann gibt es die umfassendste, einzelne Ressource für Profiling-Informationen, das Ultimative Handbuch zum Profiling von Unity-Spielen E-Book, das auf relevante Dokumentationen und andere Ressourcen verweist.

Ist es korrekt, dass Deep Profiling nur für den Allocations Profiler nützlich ist und die Ergebnisse so stark verzerrt, dass es nicht hilfreich ist, um Hänger im Spiel zu finden?

Deep Profiling kann verwendet werden, um die spezifischen Ursachen von verwalteten Zuweisungen zu finden, obwohl Allocation-Call-Stacks dasselbe mit weniger Overhead tun können. Gleichzeitig kann Deep Profiling hilfreich sein, um schnell zu untersuchen, warum ein bestimmter ProfilerMarker so lange zu dauern scheint, da es bequemer ist, es zu aktivieren, als zahlreiche ProfilerMarker zu Ihren Skripten hinzuzufügen und Ihr Spiel neu zu erstellen. Aber ja, es verzerrt die Leistung ziemlich stark und sollte daher nicht für allgemeines Profiling aktiviert werden.

Ist VSync es wert, auf jedes VBlank eingestellt zu werden? Mein mobiles Spiel läuft mit sehr niedrigen fps, wenn es deaktiviert ist.

Mobile Geräte zwingen VSync auf Treiber-/Hardware-Ebene, sodass das Deaktivieren in den Qualitätseinstellungen von Unity auf diesen Plattformen keinen Unterschied machen sollte. Wir haben von keinem Fall gehört, in dem das Deaktivieren von VSync die Leistung negativ beeinflusst. Versuchen Sie, einen Profilaufnahme mit aktiviertem VSync zu machen, zusammen mit einer weiteren Aufnahme derselben Szene, aber mit deaktiviertem VSync. Vergleichen Sie dann die Aufnahmen mit Profil-Analyzer, um zu versuchen zu verstehen, warum die Leistung so unterschiedlich ist.

Wie können Sie feststellen, ob der Hauptthread auf die GPU wartet und nicht umgekehrt?

Dies wird im Ultimative Handbuch zum Profiling von Unity-Spielen behandelt. Sie können auch weitere Informationen im Blogbeitrag Erkennung von Leistungsengpässen mit dem Unity Frame Timing Manager erhalten.

Im Allgemeinen ist das eindeutige Zeichen, dass der Hauptthread auf den Render-Thread wartet, während der Render-Thread auf die GPU wartet. Die spezifischen Markernamen variieren je nach Ihrer Zielplattform und Grafik-API, aber Sie sollten nach Markern mit Namen wie "PresentFrame" oder "WaitForPresent" Ausschau halten.

Gibt es einen soliden Prozess zur Auffindung von Speicherlecks im Profiling?

Verwenden Sie den Memory Profiler, um Speicherschnappschüsse zu vergleichen und nach Lecks zu suchen. Zum Beispiel können Sie einen Schnappschuss in Ihrem Hauptmenü machen, Ihr Spiel betreten und dann beenden, zum Hauptmenü zurückkehren und einen zweiten Schnappschuss machen. Der Vergleich dieser beiden wird Ihnen sagen, ob noch Objekte/Zuweisungen aus dem Spiel im Speicher hängen bleiben.

Die Hauptansicht des Speichers Profilers
Die Hauptansicht des Speichers Profilers

Macht es Sinn, Teile des Codes für das DOTS-System für mobile Geräte einschließlich VR/AR zu optimieren und neu zu schreiben? Verwenden Sie dieses System in Ihren Projekten?

Eine Reihe von Spielprojekten nutzt jetzt Teile des Data-Oriented Technology Stack (DOTS). Native Containers, das C# Job System, Mathematics und der Burst-Compiler sind alles vollständig unterstützte Pakete, die Sie sofort verwenden können, um optimalen, parallelisierten, hochleistungsfähigen C# (HPC#) Code zu schreiben, um die CPU-Leistung Ihres Projekts zu verbessern.

Eine kleinere Anzahl von Projekten verwendet auch Entities und zugehörige Pakete, wie den Hybrid Renderer, Unity Physics und NetCode. Zu diesem Zeitpunkt sind die aufgeführten Pakete jedoch experimentell, und ihre Verwendung beinhaltet ein gewisses Maß an technischem Risiko. Dieses Risiko ergibt sich aus einer API, die sich noch entwickelt, fehlenden oder unvollständigen Funktionen sowie der erforderlichen Lernkurve in der Technik, um Data-Oriented Design (DOD) zu verstehen, um das Beste aus Unitys Entity Component System (ECS) herauszuholen. Unity-Ingenieur Steve McGreal hat einen Leitfaden zu DOTS Best Practices geschrieben, der einige DOD-Grundlagen und Tipps zur Verbesserung der ECS-Leistung enthält.

Wie gehen Sie vor, um Grenzen für SetPass-Aufrufe oder Shader-Komplexität festzulegen? Können Sie überhaupt im Voraus Grenzen setzen?

Rendering ist ein komplexer Prozess, und es gibt keine praktische Möglichkeit, eine harte Grenze für die maximale Anzahl von SetPass-Aufrufen oder eine Metrik für die Shader-Komplexität festzulegen. Selbst auf einer festen Hardware-Plattform, wie einer einzelnen Konsole, hängen die Grenzen davon ab, welche Art von Szene Sie rendern möchten und welche anderen Arbeiten während eines Frames auf der CPU und GPU stattfinden.

Deshalb lautet die Regel, wann man profilieren sollte: „früh und oft“. Teams neigen dazu, früh in der Produktion eine „vertikale Slice“-Demo zu erstellen – normalerweise ein kurzer Gameplay-Ausschnitt, der auf das Niveau der visuellen Qualität entwickelt wird, das für das endgültige Spiel vorgesehen ist. Dies ist Ihre erste Gelegenheit, das Rendering zu profilieren und herauszufinden, welche Optimierungen und Grenzen möglicherweise erforderlich sind. Der Profilierungsprozess sollte jedes Mal wiederholt werden, wenn ein neuer Bereich oder ein anderes wichtiges visuelles Element hinzugefügt wird.

Weitere Ressourcen zur Profilierung in Unity