Optimierung der 3D-Leistung

Wegschneiden

Godot schneidet automatisch Sichtbereiche aus, um das Rendern von Objekten außerhalb des Ansichtsfensters zu verhindern. Dies funktioniert gut für Spiele die auf kleinem Raum stattfinden. In größeren Levels kann es jedoch schnell zu Problemen kommen.

Umgebungsverdeckung

Walking around a town for example, you may only be able to see a few buildings in the street you are in, as well as the sky and a few birds flying overhead. As far as a naive renderer is concerned however, you can still see the entire town. It won't just render the buildings in front of you, it will render the street behind that, with the people on that street, the buildings behind that. You quickly end up in situations where you are attempting to render 10× or 100× more than what is visible.

Things aren't quite as bad as they seem, because the Z-buffer usually allows the GPU to only fully shade the objects that are at the front. This is called depth prepass and is enabled by default in Godot when using the GLES3 renderer. However, unneeded objects are still reducing performance.

One way we can potentially reduce the amount to be rendered is to take advantage of occlusion. As of Godot 3.3, there is no built in support for occlusion in Godot. However, with careful design you can still get many of the advantages.

For instance, in our city street scenario, you may be able to work out in advance that you can only see two other streets, B and C, from street A. Streets D to Z are hidden. In order to take advantage of occlusion, all you have to do is work out when your viewer is in street A (perhaps using Godot Areas), then you can hide the other streets.

This is a manual version of what is known as a "potentially visible set". It is a very powerful technique for speeding up rendering. You can also use it to restrict physics or AI to the local area, and speed these up as well as rendering.

Bemerkung

In some cases, you may have to adapt your level design to add more occlusion opportunities. For example, you may have to add more walls to prevent the player from seeing too far away, which would decrease performance due to the lost opportunies for occlusion culling.

Andere Verdeckungstechniken

Es gibt andere Verdeckungstechniken wie Portale, automatisches PVS und rasterbasierte Umgebungsverdeckung. Einige davon sind möglicherweise über Addons verfügbar und werden möglicherweise in Zukunft in Godot verfügbar sein.

Transparente Objekte

Godot sorts objects by Material and Shader to improve performance. This, however, can not be done with transparent objects. Transparent objects are rendered from back to front to make blending with what is behind work. As a result, try to use as few transparent objects as possible. If an object has a small section with transparency, try to make that section a separate surface with its own material.

Für mehr Informationen siehe diese Anleitung GPU optimizations.

Detailgrad (LOD=Level of detail)

In some situations, particularly at a distance, it can be a good idea to replace complex geometry with simpler versions. The end user will probably not be able to see much difference. Consider looking at a large number of trees in the far distance. There are several strategies for replacing models at varying distance. You could use lower poly models, or use transparency to simulate more complex geometry.

Billboards und Imposters

Die einfachste Art Transparenz in Verbindung mit LOD zu Verwenden sind Billboards. Sie können beispielsweise ein einzelnes transparentes Quadrat verwenden, um einen Baum in der Ferne darzustellen. Dies kann sehr günstig zu rendern sein, es sei denn natürlich, es stehen viele Bäume voreinander. In diesem Fall kann die Transparenz die Füllrate beeinträchtigen (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.

MultiMesh-Intanzen verwenden

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 Leistungskosten. Dies macht es ideal für Herden, Gras, Partikel und alles andere, bei dem Sie Tausende identischer Objekte haben.

Siehe auch das MultiMesh nutzen Dokument.

Beleuchtung einbrennen

Das Beleuchten von Objekten ist eine der teuersten Rendervorgänge. Echtzeitbeleuchtung, Schatten (insbesondere Mehrfachbeleuchtung) und GI sind besonders teuer. Sie sind möglicherweise einfach zu viel für mobile Geräte mit geringerem Stromverbrauch.

Erwägen Sie die Verwendung eingebrannter Beleuchtung, insbesondere für Mobilgeräte. Dies kann fantastisch aussehen, hat aber den Nachteil nicht dynamisch zu sein. Manchmal ist dies ein Kompromiss, der sich aber lohnt.

Wenn mehrere Lichter eine Szene beeinflussen müssen, verwenden Sie im Allgemeinen gebrannte LightMaps. Das einbrennen kann auch die Szenenqualität verbessern, indem indirekte Lichtreflexe hinzugefügt werden.

Animation und Skinning

Animationen und insbesondere Vertex-Animationen wie Skinning und Morphing können auf einigen Plattformen sehr teuer sein. Möglicherweise müssen Sie die Anzahl der Polygone für animierte Modelle erheblich senken oder die Anzahl der auf dem Bildschirm angezeigten Modelle gleichzeitig begrenzen.

Große Welten

Wenn Sie große Welten erschaffen, gibt es andere Überlegungen als die, die Sie aus 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.

There may also be rendering and physics glitches due to floating point error in large worlds. You may be able to use techniques such as orienting the world around the player (rather than the other way around), or shifting the origin periodically to keep things centred around Vector3(0, 0, 0).