Menu
CoddyTech

Dlaczego używać poolingu obiektów

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

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.

quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Architektura gier w Unity