Итак, я частично объясняю свою первую игру на Android и после просмотра длинной презентации по оптимизации игр, я проверял свои ассигнования. Мне удалось избавиться от всех распределений внутри игры, кроме тех, которые сделали мой ArrayList, когда он создает неявный итератор для соглашения for (Object o: m_arrayList).Предотвращение выделения для итераторов ArrayList в Java
Есть довольно много таких итераций/ассигнований, поскольку все мои игровые объекты, сущности и т. Д. Хранятся в них для удобства их использования.
Итак, каковы мои варианты?
Я мог бы, теоретически указать разумный upperbounds и использовать массивы, но мне нравится черты ArrayList, такие как существует и удалить хранящие коды чистые и простой.
Переопределить ArrayList и предоставить мою собственную реализацию итератора(), которая возвращает член класса, а не выделяет новый тип итератора каждый раз, когда он используется.
Я бы предпочел перейти на вариант 2 для удобства использования, но я немного пошёл на это и столкнулся с проблемами. Кто-нибудь имеет пример того, что я описал в варианте 2 выше? У меня возникали проблемы с наследованием от родового класса, по-видимому, конфликты типа.
Второй вопрос к этому вопросу - есть ли другие варианты для избежания этих распределений?
И я думаю, что в качестве бонусного вопроса, знает ли кто-нибудь, если ArrayList предварительно выделяет несколько слотов памяти на определенную сумму (указанную как в ctor, так и в качестве некоторого сдвигаемого значения) и никогда не понадобится делать какие-либо другие распределения так долго как вы остаетесь в этих пределах? Даже после ясного()?
Спасибо заранее, извините, что есть так много, но я думаю, что эта информация может быть полезна многим людям.
Я не вижу упоминания о тестировании/профилировании. Это на самом деле узкое место в производительности? – Thomas
за ваш бонусный вопрос, ArrayList, построенный без параметра начальной емкости, сначала выделяет пространство для 10 объектов в списке и растет по начальной емкости, когда это необходимо. Вы можете вызвать 'trimToSize', чтобы сэкономить место. – Pedantic
Для бонусного вопроса ArrayList по умолчанию делит пропускную способность 10. http://stackoverflow.com/a/4666050/340068 –