Menu
CoddyTech

Warum Objekte poolen

Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 37 von 50.

Eine Waffe, die eine Minute lang 10 Kugeln pro Sekunde abfeuert, ruft 600-mal Instantiate und 600-mal Destroy auf. Jedes Instantiate kopiert das Prefab mit all seinen Komponenten und führt deren Awake, OnEnable und Start aus. Jedes Destroy führt OnDisable und OnDestroy aus und hinterlässt den Speicher des Objekts als Garbage. Der Garbage Collector von C# gibt diesen Speicher später frei. Seine Arbeit fällt in manchen Frames an und in anderen nicht, was sich als Ruckeln bemerkbar macht – am stärksten auf langsameren Handys.

Ein Pool behält Objekte, anstatt sie zu zerstören. Eine verschossene Kugel wird mit SetActive(false) deaktiviert und kommt zurück in den Pool; beim nächsten Schuss wird eine Kugel herausgenommen und aktiviert. Instantiate wird nur aufgerufen, wenn der Pool leer ist. Nach den ersten paar Sekunden des Schießens entstehen durch das Abfeuern keine neuen Objekte mehr und es fällt kein Garbage an. Bei der Wiederverwendung werden Awake und Start nicht erneut ausgeführt: Sie wurden einmal ausgeführt, als das Objekt erstellt wurde. Alles, was bei jeder Verwendung zurückgesetzt werden muss, etwa ein Timer, die Gesundheit oder eine Geschwindigkeit, wird in OnEnable oder durch den Code zurückgesetzt, der das Objekt aus dem Pool nimmt.

Pooling lohnt sich für Objekte, die häufig erstellt und wieder verworfen werden: Kugeln, Funken, Schadenszahlen und die Gegner eines Wellenspiels. Es lohnt sich nicht für einen Boss, der nur einmal erscheint, oder ein Menü, das sich nur gelegentlich öffnet. Ein Pool hält den Speicher für seine inaktiven Objekte ständig belegt. Deshalb sollte er eine sinnvolle Anzahl an Objekten behalten und überschüssige freigeben.

Probier es selbst

Diese Lektion enthält keine Programmieraufgabe.

quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Spielarchitektur in Unity