Korzystanie z kolekcji w tworzeniu gier na Androida nie jest zalecane?

10

Pracując nad projektem gry dla Androida, szukałem informacji na temat optymalizacji wydajności kodu gry. I dowiedziałem się, że korzystanie z kolekcji Java, takich jak Lista, Arraylist itp., Nie jest zalecane w kodach gier, chociaż kolekcja jest przydatnym narzędziem w programowaniu Java. Dlaczego tak jest? Chciałbym poznać szczegóły techniczne, jak duży wpływ może mieć środowisko Collection na systemy Android i dlaczego? Każda pomoc w tym względzie będzie świetna.

GamDroid
źródło
Gdzie to przeczytałeś?
egarcia
prawdopodobnie tutaj: developer.android.com/guide/practices/design/performance.html Zwróć uwagę, jak to mówi: Podsumowując: domyślnie użyj rozszerzonej pętli for, ale weź pod uwagę ręcznie odliczoną pętlę dla krytycznej wydajności iteracji ArrayList.
Nailer

Odpowiedzi:

8

Chodzi głównie o przydział pamięci i wyrzucanie elementów bezużytecznych. Przydziały pamięci w czasie wykonywania dają śmieciarzowi szansę na wyrzucenie śmieci. Co szkodzi twojej wydajności. GC powinno się zdarzać tak rzadko, jak to możliwe.

Większość kolekcji Java:

A) Przydziel więcej pamięci, niż potrzebują.

B) Przydziel pamięć, jeśli nie chcesz.

C) Przydziel pamięć dla każdego iteratora podczas iteracji w kolekcji.

Aby obejść te rzeczy:

A) Przydziel kolekcje o ustalonych rozmiarach. to znaczy. tworzyć pule obiektów.

B) Przeznaczyć te baseny przy programu init.

C) Unikaj for (Object obj: collection) dla tych typów kolekcji, które mają metodę size () i .get (int index).

Mistrz
źródło
2
Wszystkie ważne punkty, ale należy pamiętać: „Powinniśmy zapomnieć o małej wydajności, powiedzmy około 97% czasu: przedwczesna optymalizacja jest źródłem wszelkiego zła”. Powinieneś ograniczyć takie optymalizacje do miejsc, w których są one naprawdę potrzebne. We wszystkich innych miejscach walcz o przejrzysty i prosty design.
Michael Klement
@ Michael: W dzisiejszych systemach, z szybkimi pamięciami podręcznymi i wolną pamięcią oraz wieloma rdzeniami, przydziały pamięci są najdroższą rzeczą, jaką możesz zrobić.
2
@Michael: Trudno byłoby znaleźć jakikolwiek wysokowydajny silnik gier komercyjnych, który nie robi tyle, ile może, by zoptymalizować wzorce alokacji pamięci. Oto długa rozmowa na temat gier na Androida w czasie rzeczywistym. Jest trochę stary, ale większość powinna nadal obowiązywać: youtube.com/watch?v=U4Bk5rmIpic
Nailer
Jasne, nie zrozum mnie źle: nie chciałem się nie zgadzać z twoją odpowiedzią. Chciałem tylko zaznaczyć, że powinieneś optymalizować optymalnie i we właściwych miejscach. Nie ma korzyści z używania tablic zamiast kolekcji w miejscu, które ma minimalny wpływ na wydajność (powiedzmy 1%). (Omówiono też bardziej szczegółowo tutaj: developer.android.com/guide/practices/design/… )
Michael Klement
3
@AttackingHobo: Nie zgadzam się. Optymalizacja na ślepo nie jest korzystna, tak brzmi dla mnie twoje zdanie (popraw mnie, jeśli się mylę). Chris Pruett stwierdził również w zamieszczonym powyżej Google IO Video: „Wybierz elastyczność ponad prędkość każdego dnia tygodnia ... aż do uszkodzenia gry”. i zgadzam się z tym.
Michael Klement