LINUX.ORG.RU

Сработает ли в моем случае идея заменить arrayList массивом

 


0

1

У меня есть arrayList некоторых объектов, их в среднем 150, максимум около 1000. Они часто создаются и удаляюсь(около 30 в секунду). Проблема в том что удаляются они из середины, и если я правильно понимаю механизм arrayList то стоимость этой операции тем больше чем дальше элемент храниться от последнего элемента. Но мне порядок элементов не важен.

Моя идея в следующем, создаем массив с максимально возможным количеством объектов, дальше в некой переменной (пусть count) храним количество этих объектов. При добавлении элемента просто создаем его в array[count] = new Obj(); При удалении из середины последний объект перемешаем в тот что удаляем. В результате работает быстрее. Более того, никаких проблем с многопоточностью.

array[this_element_delete] = array[count-1];
array[count-1] = null;

Но собственно я плохо знаю джаву, как в этом случае будет вести себя сборщик мусора? Другие подводные камни?

★★★
Ответ на: комментарий от maloi

Вот у тебя вроде 4 звезды, но ты не можешь понять что я делаю.

У меня СНАРЯДЫ. мои бойцы их могут создать. Каждый фрейм с каждый снарядом выполняется действие(изменяются координаты - они летят). Когда они попадают в цель они удаляются из вектора.

abs ★★★
() автор топика
Ответ на: комментарий от abs

Вот у тебя вроде 4 звезды, но ты не можешь понять что я делаю.

количество звезд не влияет на способность телепатически извлекать твои мысли. это скорее ты не можешь понять, что я от тебя хочу узнать.

У меня СНАРЯДЫ. мои бойцы их могут создать. Каждый фрейм с каждый снарядом выполняется действие(изменяются координаты - они летят). Когда они попадают в цель они удаляются из вектора.

ты напиши в псевдокоде (или кусок реального кода приложи), как ты их оттуда будешь удалять, т.к. то что ты описал - можно сделать без всяких векторов.

maloi ★★★★★
()
Ответ на: комментарий от abs

У меня СНАРЯДЫ. мои бойцы их могут создать. Каждый фрейм с каждый снарядом выполняется действие(изменяются координаты - они летят). Когда они попадают в цель они удаляются из вектора.

Создай массив на максимальное число снарядов. В классе снаряда создай поле active. Если нужно создать снаряд — ищешь первый попавшийся объект с active=false, делаешь ему active=true и используешь его. Вместо удаления снаряда делаешь active=false. Есть готовые коллекции для работы в подобном стиле, ключевое слово для гугления — pooling.

Иначе раз в несколько секунд игру будет заедать на сборку мусора.

PolarFox ★★★★★
()
Последнее исправление: PolarFox (всего исправлений: 1)
Ответ на: комментарий от PolarFox

Создай массив на максимальное число снарядов. В классе снаряда создай поле active. Если нужно создать снаряд — ищешь первый попавшийся объект с active=false, делаешь ему active=true и используешь его. Вместо удаления снаряда делаешь active=false. Есть готовые коллекции для работы в подобном стиле, ключевое слово для гугления — pooling.

Вроде понял. Спасибо. На этом думаю можно делать тему решенной.

abs ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.