Tymczasowe Iteratory Java spowalniają moją grę na Androida

To pytanie dotyczy zarządzania pamięcią w Javie ze względu na wydajność: ponieważ rozwijam ten program jako Android Game, a pamięć GC zabija moją wydajność. Do tej pory wykonałem dużo pracy i okazuje się, że wykonuję świetną robotę, optymalizując wykorzystanie pamięci w mojej grze, ale mam jeden problem: iteratory!

Oto co robię:

Rozpocznij poziom gry.Rozpocznij śledzenie alokacji (w ten sposób ignorujemy wszystkie alokacje, które pozostaną tak długo, jak działa poziom; mam wiele obiektów, które są tworzone tylko raz na początku poziomu i nie stanowią problemu).Zrób kilka rzeczy na poziomie i zdobądź przydziały.

Moje przydziały są pełne tego:

466 24 java.util.AbstractList $ SimpleListIterator 12 java.util.AbstractList iterator
465 24 java.util.AbstractList $ SimpleListIterator 12 java.util.AbstractList iterator
464 24 java.util.AbstractList $ SimpleListIterator 12 java.util.AbstractList iterator
463 24 java.util.AbstractList $ SimpleListIterator 12 java.util.AbstractList iterator
461 24 java.util.AbstractList $ SimpleListIterator 12 java.util.AbstractList iterator
456 24 java.util.ArrayList $ ArrayListIterator 12 java.util.ArrayList iterator
454 24 java.util.ArrayList $ ArrayListIterator 12 java.util.ArrayList iterator
453 24 java.util.ArrayList $ ArrayListIterator 12 java.util.ArrayList iterator
452 24 java.util.ArrayList $ ArrayListIterator 12 java.util.ArrayList iterator

Tak więc jedynymi obiektami, które są przydzielane podczas mojej gry, są iteratory! No dobrze, teraz to naprawię ... jaki kod powoduje problem, o który pytałem ... tutaj: to jest:

for (Segment side : listOfSides.getSides()) {
    // do stuff
}

Tak, okazuje się, że dla każdej składni wywoływany jest iterator za kulisami, aby zapełnić każdy element. Co ma sens i dokładnie to, czego się spodziewałem, ale nie zdawałem sobie sprawy z tego, że może się tak strasznie gromadzić i powodować problemy z wydajnością gier. Gdybym mógł pozbyć się tego problemu, to naprawdę sprawiłoby, że moja gra działała jak błyskawica, bez względu na to, na jakim telefonie była włączona. Więc moje pytanie brzmi: co byś zrobił, żeby nie utworzyć wszystkich tymczasowych iteratorów, a następnie natychmiast je usunąć, co spowodowałoby nieprzyjemne działanie GC? Dodatkowe punkty za zrobienie tego w sposób, który nie czyni mojego kodu całkowicie brzydkim! (A korzystanie z ndk na Androida nie wchodzi w grę)

P.S. Myślałem, że dla wszystkich moich ArrayLists mogę zacząć używać funkcji get (int i), ponieważ są tablicami za kulisami i liczbą całkowitą, której używam do indeksowania, która zostanie umieszczona na stosie, a nie na stercie. Ale dla innych obiektów, takich jak HashMap i LinkedList, nie wiem, co robić.

questionAnswers(3)

yourAnswerToTheQuestion