Menu
CoddyTech

Dlaczego używać poolingu obiektów

Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 46 z 64.

Broń, która wystrzeliwuje 10 pocisków na sekundę przez minutę, wywołuje Instantiate 600 razy i Destroy 600 razy. Każde Instantiate kopiuje prefabrykowany obiekt wraz ze wszystkimi jego komponentami i uruchamia ich Awake, OnEnable i Start. Każde Destroy uruchamia OnDisable i OnDestroy, a pamięć obiektu pozostawia jako śmieci. Moduł odśmiecania pamięci C# zwalnia tę pamięć później, a jego praca przypada na niektóre klatki, a na inne nie, co objawia się zacinaniem — najdotkliwszym na wolniejszych telefonach.

Pula przechowuje obiekty zamiast je niszczyć. Zużyty pocisk jest wyłączany za pomocą SetActive(false) i wraca do puli; przy następnym strzale jeden z obiektów jest pobierany z puli i włączany, a Instantiate jest wywoływane tylko wtedy, gdy pula jest pusta. Po pierwszych kilku sekundach strzelania kolejne strzały nie tworzą niczego nowego i nie pozostawiają śmieci. Przy ponownym użyciu Awake i Start nie uruchamiają się ponownie: zostały uruchomione raz, gdy obiekt powstał. Wszystko, co musi zostać zresetowane przy każdym użyciu, na przykład czasomierz, zdrowie lub prędkość, jest resetowane w OnEnable albo przez kod pobierający obiekt z puli.

Pula opłaca się w przypadku obiektów, które są często tworzone i porzucane: pocisków, iskier, liczb obrażeń, wrogów w grze z falami przeciwników. Nie opłaca się w przypadku bossa, który pojawia się raz, ani menu, które otwiera się od czasu do czasu. Pula przez cały czas zajmuje pamięć dla nieaktywnych obiektów, więc przechowuje rozsądną ich liczbę, a nadmiarowe usuwa.

Spróbuj swoich sił

Ta lekcja nie zawiera wyzwania z kodem.

Wszystkie lekcje w sekcji Architektura gier w Unity

Poćwicz samodzielnie: Edytor online Unity