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

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

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

  1. Начать игровой уровень.
  2. Запустите средство отслеживания распределения (таким образом, мы игнорируем все распределения, которые останутся, пока работает уровень; У меня есть много объектов, которые создаются только один раз в начале уровня, и проблема не в них ).
  3. Сделайте несколько вещей на уровне и получите ассигнования.

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

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
}

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

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

12
задан Robert Massaioli 16 July 2012 в 01:06
поделиться