
Dies ist der dritte in einer Reihe von Artikeln, in denen Optimierungstipps für Ihre Unity Projekte vorgestellt werden. Verwenden Sie sie als Leitfaden für die Ausführung mit höheren Bildraten mit weniger Ressourcen. Sobald Sie diese Best Practices ausprobiert haben, sollten Sie sich unbedingt die anderen Seiten der Serie ansehen:
Sehen Sie sich unsere neuesten Optimierungsleitfäden für Unity 6-Entwickler und Grafiker an:
Verstehen Sie die Grenzen Ihrer Zielhardware und wie Sie die GPU profilieren, um das Rendering Ihrer Grafik zu optimieren. Probieren Sie diese Tipps und Best Practices aus, um die GPU zu entlasten.
Beim Profiling ist es nützlich, mit einem Benchmark zu beginnen, der Ihnen sagt, welche Profiling-Ergebnisse Sie von bestimmten GPUs erwarten sollten.
Auf GFXBench finden Sie eine große Liste verschiedener Benchmarks für GPUs und Grafikkarten. Die Website bietet einen guten Überblick über die aktuell verfügbaren GPUs und wie sie sich im Vergleich zueinander stapeln.
Rendering-Statistiken ansehen
Klicken Sie auf die Schaltfläche Statistiken oben rechts in der Spielansicht. Dieses Fenster zeigt Ihnen Echtzeit-Rendering-Informationen zu Ihrer Anwendung während des Play-Modus. Verwenden Sie diese Daten, um die Leistung zu optimieren:
- fps: Einzelbilder pro Sekunde
- CPU Haupt: Gesamtzeit für die Verarbeitung eines Frames (und Aktualisierung des Editors für alle Windows)
- CPU-Rendering: Gesamtzeit zum Rendern eines Frames der Spielansicht
- Batches: Zu zeichnende Gruppen von Draw Calls
- Triangles (Dreiecke) und Verts (Vertices): Mesh-Geometrie
- SetPass ruft auf: Wie oft Unity Shader-Durchläufe wechseln muss, um die GameObjects auf dem Bildschirm zu rendern; jeder Durchlauf kann einen zusätzlichen CPU-Overhead verursachen.
Hinweis: Im Editor bedeutet FPS nicht unbedingt Build-Leistung. Wir empfehlen, dass Sie Ihr Build für die genauesten Ergebnisse profilieren. Die Frametime in Millisekunden ist beim Benchmarking eine genauere Metrik als Frames pro Sekunde. Weitere Informationen finden Sie im E-Book „Ultimate guide to profiling Unity games (Unity 6-Ausgabe)“.

Zum Zeichnen eines GameObjects sendet Unity einen Draw Call an die Grafik API (z.B. OpenGL, Vulkan oder Direct3D). Jeder Draw Call ist ressourcenintensiv. Zustandsänderungen zwischen Draw Calls, wie z. B. das Umschalten von Materialien, können CPU-seitig zu Leistungs-Overhead führen.
PC und Konsolenhardware können viele Draw Calls pushen, aber der Overhead jedes Calls ist immer noch hoch genug, um zu versuchen, sie zu reduzieren. Auf mobilen Geräten ist Draw Call Optimierung unerlässlich. Dies erreichen Sie mit dem Pull Call Batching.
Draw Call Batching minimiert diese Zustandsänderungen und reduziert die CPU-Kosten für das Rendering von Objekten. Unity kann mehrere Objekte mit mehreren Techniken in weniger Batches kombinieren:
- SRP Batching: Wenn Sie HDRP oder URP verwenden, aktivieren Sie den SRP Batcher in Ihrem Pipeline Asset unter Erweitert. Bei Verwendung kompatibler Shader reduziert der SRP Batcher die GPU-Einrichtung zwischen Draw Calls und macht Materialdaten dauerhaft im GPU Memory. Dies kann die CPU-Renderzeiten erheblich beschleunigen. Verwenden Sie weniger Shader-Varianten mit einer minimalen Anzahl von Keywords, um das SRP Batching zu verbessern. In dieser SRP Dokumentation erfahren Sie, wie Ihr Projekt von diesem Rendering-Workflow profitieren kann.
- GPU-Instancing: Wenn Sie eine große Anzahl identischer Objekte (z. B. Gebäude, Bäume, Gras usw. mit demselben Mesh und Material) haben, verwenden Sie GPU-Instancing. Diese Technik stapelt sie mit Grafikhardware. Um die GPU-Instancing zu aktivieren, wählen Sie Ihr Material im Projektfenster aus und aktivieren Sie im Inspector Enable Instancing.
- Statische Stapelung: Bei nicht bewegter Geometrie kann Unity Draw Calls für Meshes reduzieren, die dasselbe Material verwenden. Es ist effizienter als dynamisches Batching, verbraucht aber mehr Speicher.Markieren Sie alle Meshes, die sich nie bewegen, als Batch-Statik im Inspector. Unity kombiniert alle statischen Meshes während der Build-Zeit zu einem großen Mesh. Das StaticBatchingUtility ermöglicht es Ihnen auch, diese statischen Batches während der Laufzeit selbst zu erstellen (z. B. nachdem Sie eine prozedurale Ebene nicht bewegter Teile generiert haben).
- Dynamisches Batching: Bei kleinen Meshes kann Unity Scheitelpunkte auf der CPU gruppieren und transformieren und dann alle in einem Zug zeichnen. Hinweis: Verwenden Sie dies nur, wenn Sie über genügend Low-Poly-Meshes verfügen (nicht mehr als jeweils 300 Eckpunkte und 900 Gesamtvertex-Attribute). Andernfalls verschwendet die Aktivierung CPU-Zeit damit, kleine Meshes für das Batch zu suchen.
Sie können das Batching mit ein paar einfachen Regeln maximieren:
- Verwenden Sie so wenig Texturen wie möglich in einer Szene. Weniger Texturen erfordern weniger einzigartige Materialien, was das Batching erleichtert. Verwenden Sie nach Möglichkeit Texturatlasse.
- Baking Lightmaps immer mit der größtmöglichen Atlasgröße. Weniger Lightmaps erfordern weniger Materialzustandsänderungen, behalten aber den Speicherbedarf im Auge.
- Achten Sie darauf, dass Materialien nicht unbeabsichtigt verwendet werden. Beim Zugriff auf Renderer.material in Skripten wird das Material dupliziert und eine Referenz auf die neue Kopie zurückgegeben. Dadurch wird jede vorhandene Charge zerstört, die das Material bereits enthält. Wenn Sie auf das Material des gestapelten Objekts zugreifen möchten, verwenden Sie stattdessen Renderer.sharedMaterial.
- Behalten Sie die Anzahl der statischen und dynamischen Batch-Anzahl im Vergleich zur Gesamtzahl der Draw Calls im Auge, indem Sie während der Optimierungen den Profiler oder die Rendering-Statistiken verwenden.
Weitere Informationen finden Sie in der Dokumentation zur Auslosung von Aufrufen.

Mit dem Frame Debugger können Sie die Wiedergabe auf einem einzelnen Frame einfrieren und durchgehen, wie Unity eine Szene konstruiert, um Optimierungsmöglichkeiten zu identifizieren. Suchen Sie nach GameObjects, die unnötig rendern, und deaktivieren Sie diese, um Draw Calls pro Frame zu reduzieren.
Hinweis: Der Frame Debugger zeigt keine einzelnen Draw Calls oder Statusänderungen an. Nur native GPU-Profiler geben Ihnen detaillierte Informationen zu Draw Calls und Timing. Der Frame Debugger kann jedoch immer noch sehr hilfreich bei der Behebung von Pipeline-Problemen oder Batching-Problemen sein.
Ein Vorteil des Unity Frame Debuggers ist, dass Sie einen Draw Call mit einem bestimmten GameObject in der Szene in Verbindung bringen können. Dies erleichtert die Untersuchung bestimmter Probleme, die in externen Frame-Debuggern möglicherweise nicht möglich sind.
Weitere Informationen finden Sie in der Dokumentation zum Frame Debugger und im Abschnitt

Die Füllrate bezieht sich auf die Anzahl der Pixel, die die GPU pro Sekunde auf den Bildschirm rendern kann.
Wenn Ihr Spiel durch die Füllrate begrenzt ist, bedeutet das, dass es versucht, mehr Pixel pro Frame zu zeichnen, als die GPU verarbeiten kann.
Das mehrfache Zeichnen auf demselben Pixel wird als Overdraw bezeichnet. Overdraw verringert die Füllrate und kostet zusätzliche Speicherbandbreite. Die häufigsten Ursachen für Überziehung sind:
- Überlappende undurchsichtige oder transparente Geometrie
-Komplexe Shader, oft mit mehreren Renderdurchläufen
- Nicht optimierte Partikel
- Überlappende UI-Elemente
Es gibt zwar keinen einheitlichen Ansatz, um Overdraw-Probleme zu lösen, aber die Auswirkungen sollten minimiert werden. Experimentieren Sie zunächst mit den oben genannten Faktoren, um deren Auswirkungen zu reduzieren.
Wie bei anderen Plattformen bedeutet die Optimierung auf der Konsole oft, Draw Call Batches zu reduzieren. Es gibt einige Techniken, die helfen könnten.
- Verwenden Sie Occlusion Culling, um hinter Vordergrundobjekten versteckte Objekte zu entfernen und das Overdraw zu reduzieren. Beachten Sie, dass dies eine zusätzliche CPU-Verarbeitung erfordert, verwenden Sie also den Profiler, um sicherzustellen, dass das Verschieben von der GPU zur CPU vorteilhaft ist.
- GPU-Instancing kann auch Ihre Batches reduzieren, wenn Sie viele Objekte haben, die das gleiche Mesh und Material haben. Die Begrenzung der Anzahl der Modelle in Ihrer Szene kann die Leistung verbessern. Wenn es kunstvoll gemacht wird, können Sie eine komplexe Szene erstellen, ohne sie sich wiederholen zu lassen.
- Der SRP Batcher kann die GPU-Einrichtung zwischen DrawCalls durch Batching von Bind- und Draw-GPU-Befehlen reduzieren. Um von dieser SRP Batching zu profitieren, verwenden Sie so viele Materialien wie nötig, beschränken Sie diese jedoch auf eine kleine Anzahl kompatibler Shader (z. B. beleuchtete und unbeleuchtete Shader in URP und HDRP).
Occlusion Culling deaktiviert GameObjects, die von anderen GameObjects vollständig ausgeblendet (okklusioniert) werden. Dadurch wird verhindert, dass CPU und GPU Zeit für das Rendern von Objekten verwenden, die von der Kamera nie gesehen werden.
Das Culling erfolgt pro Kamera. Es kann große Auswirkungen auf die Leistung haben, insbesondere wenn mehrere Kameras gleichzeitig aktiviert sind. Unity verwendet zwei Arten der Keulung: Kegelstumpfkeulung und Okklusionskeulung.
Die Frustum Culling wird bei jeder Kamera automatisch durchgeführt. Es verhindert, dass GameObjects, die sich außerhalb des View Frustum befinden, gerendert werden, was zur Leistungsoptimierung beiträgt.
Über Camera.layerCullDistances können Sie die Culling-Abstände pro Layer manuell festlegen. Dies ermöglicht es Ihnen, kleine GameObjects in einer Entfernung zu kullieren, die kürzer ist als die standardmäßige farClipPlane.
Organisieren Sie GameObjects in Ebenen. Weisen Sie mit dem layerCullDistances-Array jedem der 32 Layer einen Wert zu, der kleiner ist als der farClipPlane (oder verwenden Sie 0 als Standard für den farClipPlane).
Unity kulliert zuerst nach Ebene und behält GameObjects nur auf Ebenen, die die Kamera verwendet. Anschließend werden durch Kegelstumpf-Culling alle GameObjects außerhalb des Kamerakegelstumpfs entfernt. Frustum Culling wird als eine Reihe von Aufgaben ausgeführt, um die verfügbaren Worker-Threads zu nutzen.
Jeder Layer Culling Test ist sehr schnell (im Grunde nur eine Bitmaskenoperation). Diese Kosten könnten sich jedoch immer noch auf eine sehr große Anzahl von GameObjects summieren. Wenn dies für Ihr Projekt zu einem Problem wird, müssen Sie möglicherweise ein System implementieren, um Ihre Welt in „Sektoren“ aufzuteilen und Sektoren, die außerhalb des Kamerastumpfs liegen, zu deaktivieren, um den Druck auf das Layer/Frustum-Culling-System von Unity etwas zu verringern.
Okklusionskulting entfernt alle GameObjects aus der Spielansicht, wenn die Kamera sie nicht sehen kann. Verwenden Sie diese Funktion, um das Rendering von Objekten zu verhindern, die sich hinter anderen Objekten verbergen, da diese immer noch rendern und Ressourcen kosten können. Beispielsweise ist das Rendern eines anderen Raums unnötig, wenn eine Tür geschlossen ist und die Kamera nicht in den Raum sehen kann.
Die Aktivierung von Okklusionskulling kann die Leistung erheblich steigern, erfordert aber auch mehr Speicherplatz, CPU-Zeit und RAM. Unity speichert die Okklusionsdaten während des Builds und muss sie dann während des Ladens einer Szene von der Festplatte auf den RAM laden.
Während das Kegelstumpf-Culling außerhalb der Kameraansicht automatisch erfolgt, ist das Okklusions-Culling ein Baking-Prozess. Markieren Sie einfach Ihre Objekte als Static.Occlusions oder Ocludes und backen Sie dann über das Dialogfeld Fenster > Rendering > Occlusion Culling.
Weitere Informationen finden Sie im Tutorial Arbeiten mit Okklusion Culling.

Dynamische Auflösung zulassen ist eine Kameraeinstellung, mit der Sie einzelne Renderziele dynamisch skalieren können, um die GPU zu entlasten. In Fällen, in denen die Bildrate der Anwendung abnimmt, können Sie die Auflösung schrittweise verringern, um eine konsistente Bildrate beizubehalten.
Unity löst diese Skalierung aus, wenn die Leistungsdaten darauf hindeuten, dass die Framerate infolge der GPU-gebundenen Konfiguration im Begriff ist zu sinken. Sie können diese Skalierung auch präventiv manuell mit Skript auslösen. Dies ist nützlich, wenn Sie sich einem GPU-intensiven Abschnitt der Anwendung nähern. Bei schrittweiser Skalierung kann die dynamische Auflösung nahezu unbemerkt bleiben.
Weitere Informationen und eine Liste der unterstützten Plattformen finden Sie auf der Handbuchseite für dynamische Auflösung.
Manchmal müssen Sie während Ihres Spiels aus mehr als einem Blickwinkel rendern. Beispielsweise ist es in einem FPS-Spiel üblich, die Waffe und die Umgebung des Spielers getrennt mit verschiedenen Sichtfeldern (FOV) zu zeichnen. Dadurch wird verhindert, dass sich die Vordergrundobjekte durch das Weitwinkel-FOV des Hintergrunds betrachtet zu verzerrt anfühlen.
Sie könnten Kamera-Stacking in URP verwenden, um mehr als eine Kameraansicht zu rendern. Es werden jedoch noch erhebliche Culling- und Rendering-Vorgänge für jede Kamera durchgeführt. Jede Kamera verursacht einen gewissen Overhead, unabhängig davon, ob sie bedeutende Arbeit leistet oder nicht. Verwenden Sie nur Kamerakomponenten, die für das Rendering erforderlich sind. Auf mobilen Plattformen kann jede aktive Kamera bis zu 1 ms CPU-Zeit verbrauchen, auch wenn nichts gerendert wird.

Probieren Sie in der URP anstelle mehrerer Kameras eine benutzerdefinierte Rendering-Funktion für Objekte aus. Wählen Sie Rendererfunktion hinzufügenim Rendererdaten-Asset aus. Wählen Sie „Renderobjekt“.
Beim Überschreiben der einzelnen Renderobjekte können Sie:
- Verknüpfen Sie es mit einem Ereignis und fügen Sie es in ein bestimmtes Timing der Renderschleife ein
- Filtern nach Renderwarteschlange (transparent oder undurchsichtig) und LayerMask
- Beeinflussen Sie die Tiefen- und Schabloneneinstellungen
- Kameraeinstellungen ändern (Sichtfeld und Positionsversatz)

In HDRP können Sie benutzerdefinierte Durchläufe mit ähnlichem Effekt verwenden. Die Konfiguration eines benutzerdefinierten Durchgangs mit einem benutzerdefinierten Durchgangsvolumen ist analog zur Verwendung eines HDRP Volumes.
Mit einem benutzerdefinierten Pass können Sie:
- Ändern Sie das Erscheinungsbild von Materialien in Ihrer Szene
- Reihenfolge ändern, in der Unity GameObjects rendert
- Kamerapuffer in Shader einlesen
Durch die Verwendung benutzerdefinierter Durchlaufmengen in HDRP können Sie zusätzliche Kameras und den damit verbundenen zusätzlichen Overhead vermeiden. Benutzerdefinierte Durchläufe bieten zusätzliche Flexibilität bei der Interaktion mit Shadern. Sie können die Klasse Custom Pass auch mit C# erweitern.

Wenn Objekte in die Ferne rücken, kann Level of Detail (LOD) sie anpassen oder wechseln, um niedriger aufgelöste Meshes mit einfacheren Materialien und Shadern zu verwenden. Dies stärkt die GPU-Leistung.
Weitere Einzelheiten finden Sie im Kurs Arbeiten mit LODs zu Unity Learn.

Profilieren Sie Ihre Post-Processing-Effekte, um deren Kosten auf der GPU zu sehen. Einige Vollbildeffekte wie Bloom und Schärfentiefe können teuer sein, aber experimentieren Sie, bis Sie ein gutes Gleichgewicht zwischen visueller Qualität und Leistung finden.
Die Nachbearbeitung neigt dazu, während der Laufzeit nicht viel zu schwanken. Sobald Sie Ihre Volume Overrides festgelegt haben, weisen Sie Ihren Posteffekten einen statischen Anteil Ihres Gesamt-Frame-Budgets zu.

Tessellation unterteilt Formen in kleinere Versionen dieser Form. Dies kann die Details durch eine vergrößerte Geometrie verbessern. Obwohl es Beispiele gibt, in denen Tessellation sinnvoll ist, wie bei realistischer Baumrinde, vermeiden Sie Tessellation auf Konsolen im Allgemeinen. Sie können auf der GPU teuer sein.
Wie Tesselations-Shader können Geometrie- und Vertex-Shader zweimal pro Frame auf der GPU ausgeführt werden – einmal während des Tiefen-Prepasses und erneut während des Schatten-Passes.
Wenn Sie Vertex-Daten auf der GPU generieren oder modifizieren möchten, ist ein Computing-Shader oft die bessere Wahl als ein Geometrie-Shader. Die Arbeit in einem Compute Shader bedeutet, dass der Vertex Shader, der die Geometrie tatsächlich rendert, vergleichsweise schnell und einfach sein kann.
Erfahren Sie mehr über Shader-Kernkonzepte.
Wenn Sie einen Draw Call an die GPU senden, teilt sich diese Arbeit in viele Wellenfronten auf, die Unity über die verfügbaren SIMDs innerhalb der GPU verteilt.
Jede SIMD hat eine maximale Anzahl von Wellenfronten, die gleichzeitig ausgeführt werden können. Die Wellenfrontbelegung bezieht sich darauf, wie viele Wellenfronten aktuell im Verhältnis zum Maximum genutzt werden. Dies misst, wie gut Sie das Potenzial der GPU nutzen. Konsolenspezifische Leistungsanalysetools zeigen die Wellenfrontbelegung sehr detailliert.
Im Beispiel unten erscheinen Vertex-Shader-Wellenfronten in Grün. Pixel-Shader-Wellenfronten erscheinen in Blau. Im unteren Diagramm erscheinen viele Vertex-Shader-Wellenfronten ohne große Pixel-Shader-Aktivität. Dies zeigt eine unzureichende Ausschöpfung des Potenzials der GPU.
Wenn Sie viel Vertex-Shader-Arbeit ausführen, die nicht zu Pixeln führt, kann das auf eine Ineffizienz hinweisen. Eine niedrige Wellenfrontbelegung ist zwar nicht unbedingt schlecht, aber sie ist eine Metrik, um Ihre Shader zu optimieren und auf andere Engpässe zu prüfen. Wenn Sie beispielsweise aufgrund von Speicher- oder Rechenvorgängen einen Stillstand haben, kann eine höhere Belegung die Leistung verbessern. Andererseits können zu viele Wellenfronten während des Fluges zu Cache-Thrashing und einer Verschlechterung der Leistung führen.

Wenn Sie die GPU in Intervallen unterauslasten, können Sie mit Async Compute nützliche Compute-Shader-Arbeiten parallel in Ihre Grafikwarteschlange verschieben. Dadurch werden diese GPU-Ressourcen besser genutzt.
Beispielsweise führt die GPU während der Shadow-Map-Generierung Deep-Only-Rendering durch. An diesem Punkt findet nur sehr wenig Pixel-Shader-Arbeit statt, und viele Wellenfronten bleiben unbesetzt.
Wenn Sie einige Compute-Shader-Arbeiten mit dem Deep-Only-Rendering synchronisieren können, sorgt dies für eine bessere Gesamtnutzung der GPU. Die ungenutzten Wellenfronten könnten bei der Screen-Space-Umgebungsokklusion oder jeder anderen Aufgabe, die die aktuelle Arbeit ergänzt, helfen.
Sehen Sie sich diese Sitzung zum Thema Leistungsoptimierung für High-End-Konsolen von Unite an.

Der GPU Resident Drawer (verfügbar sowohl für URP als auch für HDRP) ist ein GPU-gestütztes Rendering-System, das die CPU-Zeit optimiert und erhebliche Leistungsvorteile bietet. Es unterstützt plattformübergreifendes Rendering und ist darauf ausgelegt, sofort mit bestehenden Projekten zu arbeiten.
Das System kann innerhalb des HDRP oder URP Render Pipeline Asset aktiviert werden. Wählen Sie „Instanzzeichnung“ aus, um sie zu aktivieren. Sie können auch auswählen, ob sie nur im Wiedergabemodus oder auch im Bearbeitungsmodus aktiviert werden soll.
Wenn Sie den GPU Resident Drawer aktivieren, können Spiele, die aufgrund einer hohen Anzahl von Draw Calls CPU-gebunden sind, die Leistung verbessern, da die Anzahl der Draw Calls reduziert wird. Die Verbesserungen, die Sie sehen werden, hängen von der Größe Ihrer Szenen und dem Grad der verwendeten Instanzierung ab. Je mehr instanzielle Objekte Sie rendern, desto größer sind die Vorteile, die Sie sehen werden.
Wenn Sie die Option „Instanzzeichnung“ auswählen, erhalten Sie möglicherweise eine Meldung in der Benutzeroberfläche, in der Sie gewarnt werden, dass die Einstellung „BatchRenderGroup Variants“ „Keep All“ sein muss. Das Anpassen dieser Option in den Grafikeinstellungen schließt die Einrichtung für den GPU Resident Drawer ab.
Mehr dazu erfahren Sie hier in unserem Diskussions-Thread.

Die GPU-Okklusionskultivierung, die sowohl für URP als auch für HDRP verfügbar ist, funktioniert zusammen mit dem GPU Resident Drawer. Es steigert die Leistung erheblich, indem es den Overdraw für jeden Frame reduziert, was bedeutet, dass der Renderer keine Ressourcen verschwendet, um Dinge zu zeichnen, die nicht gesehen werden.
Um die GPU-Okklusion zu aktivieren, suchen Sie das Render-Pipeline-Asset und aktivieren Sie das Kontrollkästchen GPU-Okklusion.
Um die GPU-Occlusion Culling im Debug-Modus in Unity 6 zu aktivieren, gehen Sie zu Fenster > Rendering > Occlusion Culling. Hier können Sie visualisieren, wie Objekte gekeult werden, indem Sie verschiedene Visualisierungsoptionen aktivieren.


Im Hub für Best Practices von Unity finden Sie viele weitere Best Practices und Tipps für fortgeschrittene Unity Entwickler. Wählen Sie aus über 30 Leitfäden aus, die von Branchenexperten, Unity Entwicklern und Technical Artists erstellt wurden und Ihnen helfen, mit den Toolsets und Systemen von Unity effizient zu entwickeln.