(Object) Pooling ist ein Entwurfsmuster (= Design Pattern). Sozusagen eine Programmiervorlage um die CPU-Last und die Fragmentierung (Aufteilung von Speicherblöcken) des Speichers, zu optimieren. Dies ist vor allem nützlich, wenn du viele Objekte, wie zum Beispiel Kugeln in einem Shooter, am Bildschirm anzeigen möchtest. In TRAILS werden die Level automatisch zur Laufzeit erstellt. Jedes Mal, wenn ein Level neu generiert wird, verwende ich Spielobjekte aus dem letzten Level wieder. Welches Objekt verwendet wird und welches nicht, regelt der Object Pool. [Unit2021]
Anwendungsgebiete
Hier bieten sich vielfältige Einsatzmöglichkeiten. Besonders nützlich sind Object Pools, wenn die Erzeugung eines Objekts (= Instanz) einer Klasse besonders aufwendig, die Instanziierung einer Klasse oft stattfindet oder die Anzahl der Instanziierungen während des Spielens hoch ist [Sour2021]. Bei folgenden Fällen, könnte ein Object Pool nützlich sein:
- Kugeln in einem Space Shooter
- Prozedural generierte Level
- Visuelle Effekte – Partikelsysteme zum Beispiel beim Zaubern
- Datenbank- oder Netzwerkverbindungen
Funktionsweise
Am einfachsten kann man sich die Verwendung von Pooling an einem Beispiel aus dem Leben vorstellen (siehe Grafik rechts). Die Küche enthält viele wiederverwendbare Gegenständen (= Pool). Würde man zum Beispiel das Geschirr (= Objekt) immer wieder wegschmeißen, dann würde sehr viel Müll entstehen. Außerdem ist Einweggeschirr auf Dauer sehr teuer. Deshalb verwendet man das Geschirr in der Regel zu jedem Essen, spült es anschließend und stellt es für das nächste Mal zurück in die Küche.
Ein verwaltetes Objekt im Pool kann grundsätzlich alles sein (z. Bsp. ein Game Object, Prefab, Klasse, Dictionary (C#) etc.). Nachdem das Objekt verwendet wurde, wird es auf seinen ursprünglichen Zustand zurückgesetzt und wieder für die neue Verwendung freigegeben.
Object Pooling in Trails
Im 2D-Prototyp baue ich einen Level nach bestimmten Regeln (siehe Blogeintrag Zelluläre Automaten) aus mehreren Einzelteilen immer wieder neu zusammen. Um das Generieren des Levels zu beschleunigen, halte ich eine bestimmte Anzahl an Objekten im Object Pool vor. Hat ein Spieler das Ende des Levels erreicht, wird danach ein neuer Level aus den bereits vorhandenen Bestandteilen neu zusammengesetzt. Sollte ein Element fehlen, so füge ich dieses neu dem Object Pool hinzu.
Vorteile
- Kann die Performanz des Spiels (vor allem bei mobilen Geräten, im Web oder auf Konsolen) verbessern
- Mehr Kontrolle über das Erstellen und Zerstören von Objekten
- Vermeidung der Fragmentierung (= Zerstückelung) des Speichers [Tobo2021]
Nachteile
- Ein Objekt Pool speichert Objekte ohne Zustand, dadurch sind diese bei jedem Abruf im Ausgangszustand (Lösung -> Caching)
- Durch das vorinstanziieren der Objekte dauert das Laden zu Beginn des Spiels länger
- Das zurücksetzen der Objekte in den Ausgangszustand kann ebenfalls Zeit und CPU-Last beanspruchen [Tobo2021]
- Der Pool verschwendet eventuell Speicher, wenn die Objekte nicht verwendet werden [Nyst2021][Tobo2021]
- Nur eine bestimmte Anzahl an Objekten kann gleichzeitig aktiv sein, wenn Poolanzahl begrenzt (Lösungen -> [Nyst2021])
- Man muss den Überblick über den Zustand der Objekte behalten, wenn das Objekt sehr viele Zustände hat und diese nicht richtig vom Programmierer zurückgesetzt werden, führt dies zu unübersichtlichen Fehlern im Programm
Beispielprojekt
Du möchtest gerne sehen, wie ich die Thematik programmiert habe? Dann lade dir jetzt das kostenlose Beispielprojekt bei Ko-Fi herunter! Quellcode herunterladen (bei Ko-fi)
Quellen und Ressourcen
Links
[Unit2021] – Introduction to Object Pooling – https://learn.unity.com/tutorial/introduction-to-object-pooling#, 18.05.2022, Abruf am 24.08.2023.
[Sour2021] – Object Pool Design Pattern – https://sourcemaking.com/design_patterns/object_pool, Abruf am 24.08.2023.
[Plac2016] – Object Pooling in Unity – https://www.kodeco.com/847-object-pooling-in-unity, 23.11.2016, Abruf am 24.08.2023.
[Tobo2021] – Object Pooling in Unity 2021+ – https://thegamedev.guru/unity-cpu-performance/object-pooling/, 30.03.2021, Abruf 24.08.2023.
[Unit2023.2] – ObjectPool<T0> Documentation – https://docs.unity3d.com/2023.2/Documentation/ScriptReference/Pool.ObjectPool_1.html, Abruf 24.08.2023.
[Spen2021] – Object-Pooler C# Abstrakte Klasse – https://github.com/Matthew-J-Spencer/Object-Pooler, 30.10.2021, Abruf 24.08.2023.
[Nyst2021] – Object Pool – http://gameprogrammingpatterns.com/object-pool.html, Abruf 24.08.2023.
Videos
[Taro2021] – Object Pooling in Unity 2021 is Dope AF – Channel Tarodev – https://www.youtube.com/watch?v=7EZ2F-TzHYw, 30.10.2021, Abruf 24.08.2023.
Bücher
[Unit2023] – Kostenloses E-Book – Level up your code with game programming patterns – https://resources.unity.com/games/level-up-your-code-with-game-programming-patterns, Abruf 23.08.2023.
About Me
Mein Name ist Anika und ich bin Software-Entwicklerin. Ich liebe Computerspiele, Zeichnen, Kiten, Schreiben und Bücher. Hier auf meinem persönlichen Blog geht es vor allem um die Spiele-Entwicklung, mein Unternehmen codepixie und persönliche Themen, die mich beschäftigen.