Object Pool

Bardzo dziękuję Annie Sierhej za informację o Object Pool. Jest to (chyba) wzorzec projektowy, który możemy zastosować w grach. Spróbuję w dość prosty sposób przedstawić jego założenia i implementację.

To samo, ale inaczej

Najłatwiej zawsze się tłumaczy na przykładach. Załóżmy, że potrzebujemy stworzyć kilkadziesiąt obiektów, oraz że będziemy z nich korzystać co określoną ilość czasu. Mogą to być cząsteczki animacji, wrogowie, czy – jak w 50 min przykładzie, który Unity udostępnia na Youtube – pociski wystrzelone przez gracza.

Przyzwyczaiłem się do następującego schematu:

  1. Inicjalizuję obiekt.
  2. Żyje on sobie określony czas.
  3. Jak jest niepotrzebny to go usuwam i zwalniam zasoby.

Co zmienia się stosując Object Pool? Obiekty nie są inicjalizowane i usuwane, tylko przestajemy wykonywać akcje na nieaktywnych. To nie jest problem na dzisiejszym sprzęcie – nie braknie nam pamięci. Jaki otrzymujemy zysk? Brak skoków klatek.

Ciężko to zaobserwować na przykładzie prezentowanym przez Mike’a, ponieważ jest on zbyt prosty. Posiadając wszystkie potrzebne zachowania, zmiany w FPS’ach powinny być już dość duże i zauważalne.

Implementacja

Nie pisałem jeszcze dlaczego zawsze w grach wykorzystuje się zmienne typu float (praktycznie do wszystkiego – ustawienia/obliczenia). Wytłumaczenie jest banalne:

  • float – zmienna 32-bitowa, przechowuje do 7 miejsc po przecinku.
  • int32 – nie daje nam możliwości ustawienia precyzji. Nie nadaje się też do obliczeń fizyki, gdzie są potrzebne wartości po dziesiętne/setne.
  • double – zbyt duża dokładność. Nie potrzebujemy tu używać aż 15-6 miejsc po przecinku. Dodatkowo zajmuje 64 bity w pamięci.
  • decimal – bez komentarza. 28-9 miejsc po przecinku i 128 bitów w pamięci.

PS. Skrót Ctrl+K+F w Visual Studio formatuje kod w jedyny i słuszny sposób.

Skrypt SelfDestruct.cs powoduje wyłączenie obiektu po upływie wskazanego czasu. Powinien on być podpięty pod prefab wroga. Jeśli pominęlibyśmy ten etap, obiekty żyłyby swoim życiem po opuszczeniu ekranu gracza.

Wytłumaczę tu podstawy, a właściwy skrypt – którego użyję – wrzucę jutro do Git’a.