Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Optimierung der 3D-Performance

Culling

Godot führt automatisch ein View-Frustum-Culling durch, um zu verhindern, dass Objekte gerendert werden, die außerhalb des Viewports liegen. Dies funktioniert gut für Spiele, die in einem kleinen Gebiet stattfinden, jedoch können die Dinge in größeren Ebenen schnell problematisch werden.

Occlusion Culling

Wenn Sie beispielsweise durch eine Stadt spazieren, sehen Sie vielleicht nur einige Gebäude in der Straße, in der Sie sich befinden, sowie den Himmel und ein paar Vögel, die über Ihnen fliegen. Aus der Sicht eines naiven Renderers können Sie jedoch die gesamte Stadt sehen. Es werden nicht nur die Gebäude vor Ihnen gerendert, sondern auch die Straße dahinter, mit den Menschen auf dieser Straße und den Gebäuden dahinter. Man kommt schnell in Situationen, in denen man versucht, das 10- oder 100-fache dessen zu rendern, was sichtbar ist.

Die Dinge sind nicht ganz so schlimm, wie sie scheinen, denn der Z-Puffer erlaubt es der GPU in der Regel, nur Shading auf Objekte anzuwenden, die sich im Vordergrund befinden. Dies wird als Tiefen-Vordurchlauf bezeichnet und ist in Godot standardmäßig aktiviert, wenn die Rendering-Methoden Forward+ oder Kompatibilität verwendet werden. Nicht benötigte Objekte beeinträchtigen jedoch weiterhin die Performance.

Eine Möglichkeit, die zu rendernde Menge zu reduzieren, besteht darin, die Vorteile von Occlusion zu nutzen. Godot 4.0 und spätere Versionen bieten einen neuen Ansatz für die Occlusion Culling unter Verwendung von Occluder-Nodes. Siehe Occlusion Culling für Anweisungen zum Einrichten der Occlusion Culling in Ihrer Szene.

Bemerkung

In manchen Fällen müssen Sie Ihr Leveldesign anpassen, um mehr Occlusion-Möglichkeiten zu schaffen. So müssen Sie beispielsweise mehr Wände hinzufügen, um zu verhindern, dass der Spieler zu weit weg sehen kann, was die Performance aufgrund der verlorenen Möglichkeiten für das Occlusion Culling verringern würde.

Transparente Objekte

Godot sortiert Objekte nach Material und Shader, um die Performance zu verbessern. Dies kann jedoch nicht mit transparenten Objekten gemacht werden. Transparente Objekte werden von hinten nach vorne gerendert, damit das Blending mit dem, was dahinter ist, funktioniert. Versuchen Sie daher, so wenig transparente Objekte wie möglich zu verwenden. Wenn ein Objekt einen kleinen Bereich mit Transparenz hat, versuchen Sie, diesen Bereich zu einer separaten Oberfläche mit eigenem Material zu machen.

Für mehr Informationen siehe die Seite GPU optimizations.

Level of Detail (LOD)

In manchen Situationen, insbesondere aus der Entfernung, kann es sinnvoll sein, komplexe Geometrie durch einfachere Versionen zu ersetzen. Der Endbenutzer wird wahrscheinlich keinen großen Unterschied feststellen können. Betrachten Sie beispielsweise eine große Anzahl von Bäumen in der Ferne. Es gibt mehrere Strategien für das Ersetzen von Modellen in unterschiedlichen Entfernungen. Sie könnten Modelle mit niedrigeren Polygraden verwenden oder Transparenz einsetzen, um eine komplexere Geometrie zu simulieren.

Godot 4 bietet mehrere Möglichkeiten zur Steuerung des Level of Detail:

Obwohl sie unabhängig voneinander verwendet werden können, sind diese Ansätze am effektivsten, wenn sie zusammen eingesetzt werden. Sie können zum Beispiel Sichtbarkeitsbereiche einrichten, um Partikeleffekte auszublenden, die zu weit vom Spieler entfernt sind, um sie zu bemerken. Gleichzeitig können Sie sich auf Mesh-LOD verlassen, um die Meshes des Partikeleffekts in der Entfernung mit weniger Details zu rendern.

Sichtbarkeitsbereiche sind auch eine gute Möglichkeit, Imposter für entfernte Geometrien einzurichten (siehe unten).

Billboards und Imposter

Die einfachste Version der Verwendung von Transparenz zur Handhabung von LOD sind Billboards. Sie können zum Beispiel ein einzelnes transparentes Quad verwenden, um einen Baum in der Ferne darzustellen. Dies kann sehr billig zu rendern, es sei denn natürlich, es gibt viele Bäume voreinander. In diesem Fall kann sich die Transparenz auf die Füllrate auswirken (weitere Informationen zur Füllrate finden Sie unter GPU-Optimierungen).

Eine Alternative besteht darin, nicht nur einen Baum, sondern mehrere Bäume als Gruppe zusammen zu rendern. Dies kann besonders effektiv sein, wenn Sie im Spiel einen Bereich sehen, sich diesem jedoch nicht nähern können.

Sie können Imposter erstellen, indem Sie Ansichten eines Objekts in verschiedenen Winkeln vorrendern. Sie können sogar noch einen Schritt weiter gehen und eine Ansicht eines Objekts in regelmäßigen Abständen auf eine Textur übertragen, die als Imposter verwendet werden soll. In einiger Entfernung müssen Sie den Betrachter um eine beträchtliche Entfernung bewegen, damit sich der Blickwinkel erheblich ändert. Dies kann aufwendig sein bis es läuft, kann sich jedoch je nach Art des von Ihnen durchgeführten Projekts lohnen.

Intanzen verwenden (MultiMesh)

Wenn mehrere identische Objekte am selben Ort oder in der Nähe gezeichnet werden müssen, verwenden Sie stattdessen ein MultiMesh. MultiMesh ermöglicht das Zeichnen von vielen tausend Objekten zu sehr geringen Performancekosten. Dies macht es ideal für Herden, Gras, Partikel und alles andere, bei dem Sie Tausende identischer Objekte haben.

Siehe auch die Verwendung von MultiMesh-Dokumentation.

Beleuchtung backen

Die Beleuchtung von Objekten ist eine der kostspieligsten Rendering-Operationen. Echtzeit-Beleuchtung, Schatten (insbesondere mehrere Lichter) und Global Illumination sind besonders teuer. Sie können für mobile Geräte mit geringerer Leistung einfach zu viel sein.

Erwägen Sie die Verwendung von gebackener Beleuchtung, insbesondere für mobile Geräte. Das kann fantastisch aussehen, hat aber den Nachteil, dass es nicht dynamisch ist. Manchmal ist dies ein lohnender Kompromiss.

Siehe Verwenden der Lightmap-Global Illumination für Anweisungen zur Verwendung von gebackenen Lightmaps. Um die beste Performance zu erzielen, sollten Sie den Back-Modus der Lichtquellen auf Statisch setzen, im Gegensatz zum Default Dynamisch, da dies die Echtzeit-Beleuchtung für Meshes mit gebackener Beleuchtung überspringt.

Der Nachteil von Lichtqueleln mit dem Back-Modus Statisch ist, dass sie keine Schatten auf Meshes mit gebackener Beleuchtung werfen können. Dies kann dazu führen, dass Szenen mit Außenbereichen und dynamischen Objekten flach aussehen. Ein gutes Gleichgewicht zwischen Performance und Qualität besteht darin, Dynamisch für den Node DirectionalLight3D beizubehalten und Statisch für die meisten (wenn nicht alle) Omni- und Spot-Lichterquellen zu verwenden.

Animation und Skinning

Animation und Vertex-Animation wie Skinning und Morphing können auf einigen Plattformen sehr teuer sein. Möglicherweise müssen Sie die Polygonanzahl für animierte Modelle erheblich reduzieren oder die Anzahl der Modelle auf dem Bildschirm begrenzen. Sie können auch die Animationsrate für weit entfernte oder verdeckte Meshes verringern oder die Animation ganz anhalten, wenn der Spieler wahrscheinlich nicht bemerkt, dass die Animation angehalten wird.

Die Nodes VisibleOnScreenEnabler3D und VisibleOnScreenNotifier3D können für diesen Zweck nützlich sein.

Große Welten

Wenn Sie große Welten erstellen, müssen Sie andere Überlegungen anstellen, als Sie es vielleicht von kleineren Spielen kennen.

Große Welten müssen möglicherweise in Kacheln gebaut werden, die bei Bedarf geladen werden können, wenn Sie sich in der Welt bewegen. Dies beschränkt die erforderliche Verarbeitung auf den lokalen Bereich und kann verhindern, dass die Speichernutzung außer Kontrolle gerät.

Es kann auch zu Rendering- und Physikproblemen aufgrund von Float-Fehlern in großen Welten kommen. Dies kann mit Große-Welt-Koordinaten behoben werden. Wenn die Verwendung von Große-Welt-Koordinaten eine Option ist, können Sie vielleicht Techniken wie die Ausrichtung der Welt um den Spieler (statt umgekehrt) oder das periodische Verschieben des Ursprungs verwenden, um die Dinge um Vector3(0, 0, 0) zu zentrieren.