Временные итераторы Java замедляют мою игру для Android

Этот вопрос касается управления памятью в Java по соображениям производительности: поскольку я разрабатываю эту программу в качестве игры для Android, а ГХ памяти убивают мою производительность. Итак, я проделал большую работу до сих пор, и оказалось, что я отлично справляюсь с оптимизацией использования памяти моей игрой, но у меня есть одна проблема: итераторы!

Вот что я делаю:

Start game level. Start allocation tracker (this way we ignore all of the allocations that will remain for as long as the level runs; I have many objects that only get created once at the beginning of the level and they are not the problem). Do a few things in the level and get the allocations.

Мои ассигнования полны этого:

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

Таким образом, единственные объекты, которые выделяются во время работы моей игры, это итераторы! Хорошо, теперь, чтобы исправить это ... какой код вызывает проблему, которую я спросил ... вот она:

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

Да, получается, что синтаксис for-each вызывает итератор за кулисами для заполнения каждого элемента. Это вполне логично и именно так, как я ожидал, но я не понимал, что это может так ужасно нарастить и вызвать проблемы с производительностью игр. Если бы я мог избавиться от этой проблемы, то моя игра действительно работала бы молниеносно, независимо от того, на каком телефоне она была. Итак, мой вопрос: что бы вы сделали, чтобы все эти временные итераторы не были созданы, а затем немедленно отброшены, что привело к неприятным запускам GC? Бонусные баллы за то, что мой код не выглядит совершенно безобразным! (И использование ndk на Android не вариант)

Постскриптум Я думал, что для всех моих ArrayLists я мог бы начать использовать функцию get (int i), поскольку они являются закулисными массивами и целым числом, которое я использовал бы для индексации, который будет помещен в стек, а не в кучу. Но для других объектов, таких как HashMap и LinkedList, я не уверен, что делать.

Ответы на вопрос(3)

Ваш ответ на вопрос