Использование коллекций в Android Game Development не рекомендуется?

10

Во время работы над игровым проектом для Android я искал информацию об оптимизации производительности игрового кода. И я узнал, что использование Java- коллекций, таких как List, Arraylist и т. Д., Не поощряется в игровых кодах, хотя коллекция является полезным инструментом в Java-программировании. Почему так? Хотелось бы узнать технические подробности о том, как сильно фреймворк Collection может оказать на системы Android и почему? Любая помощь в этом отношении будет отличной.

GamDroid
источник
Где ты это прочитал?
egarcia
вероятно, здесь: developer.android.com/guide/practices/design/performance.html Обратите внимание, как он говорит: Подводя итог: используйте расширенный цикл for по умолчанию, но рассмотрите рукописный счетный цикл для критической итерации ArrayList.
Нейлер

Ответы:

8

В основном это касается выделения памяти и сборки мусора. Выделение памяти во время выполнения дает вашему сборщику мусора возможность вынести мусор. Что вредит вашей работе. GC должно происходить как можно реже.

Большинство коллекций Java:

А) Выделите больше памяти, чем им нужно.

Б) Выделите память, когда вы не хотите, чтобы они.

C) Выделите память для каждого итератора при выполнении итерации по коллекции.

Чтобы обойти эти вещи:

А) Выделите коллекции с фиксированными размерами. то есть. создавать пулы объектов.

Б) Выделите эти пулы в программе init.

C) Избегайте for (Object obj: collection) для тех типов коллекций, у которых есть метод size () и метод .get (int index).

гвоздильщик
источник
2
Все правильные моменты, но имейте в виду: «Мы должны забыть о малой эффективности, скажем, в 97% случаев: преждевременная оптимизация - корень всего зла». Вы должны ограничить такие оптимизации точками, где они действительно необходимы. Во всех остальных местах стремитесь к четкому и простому дизайну.
Майкл Клемент
@Michael: В современных системах с быстрым кэшированием, медленной памятью и несколькими ядрами распределение памяти - это самое дорогое, что вы можете сделать.
2
@Michael: Вам будет сложно найти какой-либо высокопроизводительный коммерческий игровой движок, который не делает столько, сколько возможно, для оптимизации шаблонов распределения памяти. Вот длинный разговор о предмете игр для Android в реальном времени. Это немного устарело, но большинство из них все еще должны применяться: youtube.com/watch?v=U4Bk5rmIpic
Nailer
Конечно, не поймите меня неправильно: я не хотел не соглашаться с вашим ответом. Я просто хотел отметить, что вы должны оптимизировать разумно и в правильных местах. Нет никакого преимущества в использовании массивов по сравнению с коллекциями в тех местах, которые оказывают минимальное влияние на производительность (скажем, 1%). (Также обсуждается более подробно здесь: developer.android.com/guide/practices/design/… )
Майкл Клемент,
3
@ AttackingHobo: я не согласен. Оптимизация вслепую не является благосклонной, и именно так мне кажется ваше утверждение (поправьте меня, если я ошибаюсь). Крис Прюетт также заявил в видео Google IO, которое было указано выше: «Выбирайте гибкость, а не скорость каждый день недели ... пока не повредит игровой процесс». и я согласен с этим
Майкл Клемент