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.
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
1Komponenty, nie hierarchie
Małe komponentyPodstawowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPodsumowanie: modułowa wieżyczka4Dane serializowane
Klasy serializowalneListy w InspectorzeWyliczenia w InspectorzePodsumowanie: tabela łupów10Projekt: Arena przetrwania
BohaterTypy wrogów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPodsumowanie: klawisz interakcji5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaFale jako danePowtórka: baza danych przedmiotów8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearest3Zdarzenia
Zdarzenia C# w UnitySubskrypcja w OnEnablePola UnityEventZdarzenia sterują interfejsemPodsumowanie: wyskakujące okno osiągnięcia6Zapisywanie za pomocą JSON
JsonUtilityZapisz gręWczytywanie i wartości domyślnePowtórka: sloty zapisu9Pooling obiektów
Dlaczego używać poolingu obiektówPool z kolejkąObjectPool w UnityPodsumowanie: pula pocisków