Набор с быстрым удалением/повторением/вставкой, которое перерабатывает объекты в программах Android/Java?

Я программирую игру для Android. Как пример, игра могла бы включить маркеры, врагов, драгоценные камни и т.д., которые должны быть:

  • созданный и уничтоженный в игровом мире во время геймплея, например, маркера огонь и затем исчезает, когда он врезается в стену.

  • полученный доступ много в последовательности, например, всех обновленных в последовательности, затем все оттянутые в последовательности.

На основе того, что я знаю так далеко от своей работы в Android, для продолжения моей частоты кадров, я должен рассмотреть следующее:

  • Не выделить объекты, когда Вы не будете иметь к тому, потому что сборщик "мусора" втолкнет и разрушит Ваш framerate.

  • Предпочтите, например, доступы локальной переменной к доступу к полям объекта и вызыванию функций.

Для игровых объектов, упомянутых выше в компьютерной игре, я был бы обычно просто, что-то любить использует что-то как Вектор или LinkedList. Однако они не переработали бы объекты, и Итератор использования создаст новый объект, а также включит несколько вызовов функции при итерации.

Что должен использовать подходящий набор?

Что я нашел, что работы хорошо в данный момент должны создать, например, стандартный массив 100 маркеров, где все 100 маркеров создаются заранее. Я затем провожу подсчет того, сколько маркеров активно, когда все активные маркеры появляются в начале массива. Каждый раз, когда я выполняю итерации по массиву маркеров, и я должен уничтожить один, я простая подкачка текущий индекс маркера с последним активным индексом маркера, затем сократить активное число маркера. Это изменяет порядок маркера, но это прекрасно.

Это работает вполне хорошо:

Профессионалы: Перерабатывает объекты, немногие/нет Недостатки вызовов функции: Подверженный ошибкам (особенно удаление) при отсутствии реализации как класс набора

Кто-либо может предложить лучшую альтернативу? Я видел много классов для управления пулами объектов, но я не уверен, которые подходят для меня.

Спасибо.

5
задан Bob Page 28 January 2010 в 05:59
поделиться

2 ответа

Я был программированным играм в конце 80-х и совсем недавно в Java для мобильных устройств. Я могу сказать вам, что вы собираетесь убить вашу рамку, если вы используете LinkedList или вектор для хранения объектов Java, соответствующие вещам, как тривиально, как пули. Это не так, как эффективные мобильные игры запрограммированы. Эффективные мобильные игры запрограммированы с учетом того, что «каждый посуд». Это одно из этих доменов, где оптимизация царит король.

За упрощением, но представьте, что у вас есть игра с в настоящее время четырьмя пулями «живыми» (это на самом деле не на самом деле «на экране», ваш «активный мир» может и обычно должен быть немного больше, чем ваш экран, это много обработки проще).

(20,30,3) (10, 50, 2) (30, 40, -3) (50, 50, 5)

Так что пуля один находится в пикселе (20,30) в вашем координате и идти со скоростью 3 (какая бы бы ни была скорость 3 означает, что это просто пример) справа (над упрощением, это просто объяснить), пуля два находится в (10,50), идет со скоростью 2 к Справа, пуля 3 находится в (30,40), идет со скоростью 3 слева (минус здесь означает слева), и последняя пуля находится в (50,50,5), идет со скоростью 5 вправо.

Как это представлено в памяти в текущих мобильных играх?

, как это, в INT []:

int [] = {4, 20, 30, 3, 10, 50, 2, 30, 30, 40, -3, 50, 50, 5, ..., ..., ...};

Первые 4 сообщает нам, что эта «структура данных 4 элемента. И вы знаете, что каждый изготовлен из 3 Значения (в нашем упрощенном примере).

Теперь представьте, что пуля 2 попадает на стену и исчезнет, ​​что происходит?

Это:

int [] = {3, 20, 30, 3, 50, 50, 5 , 30, 40, -3, 50, 50, 5, ..., ..., ...};

Мы упрощаем уменьшить первый int 3, чтобы указать, что в нашей игре остается только 3 пули Сейчас мир, и мы просто переехали (50, 50, 5) в положение «2», замена (10,50,2) на (50, 50, 5). Это потому, что порядок нашей пули не имеет значения (Все они имеют одинаковый эффект) и «перемещение всех элементов INT [] налево» было бы действительно неэффективно.

Обратите внимание, что мы даже не решили «ясно» «4-й пуля»: 50,50,5) все еще там в конце, но мы знаем, что у нас есть только 3 элемента, Так что нам все равно.

Так что отлично в памяти он выглядит так:

int [] = {3, 20, 30, 3, 50, 50, 5, 30, 40,-3, 50, 50, 5, ... , ..., ...};

Вы только обеспокоены этим:

int [] = {3, 20, 30, 3, 50, 50, 5, 30, 40, -50, ..., ..., ..., ..., ..., ...};

, что - это то, как это делается в большинстве текущих мобильных игр: нулевое создание объектов для «обработки пуль» «В главной цикле. Вы управляете такими простыми структурами данных самостоятельно, используя массивы примитивов.

и INT [] инициализируется в начале вашей игры вашего уровня до максимального количества пуль, которые могут произойти в вашей игре / уровне.

Есть ваши «многоразовые пули пуль».

Если вы начнете думать с тем, чтобы наличие объекта Java для чего-то как тривиального как пули и использование LinkedList или Vector, что вы можете изменять на каждом кадре,Вы никогда не получите допустимую производительность: вы будете генерировать бессмысленный без необходимости 50 раз в секунду и слишком часто запускают GC.

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

Моя техника «Удаление пули» включает здесь одно уменьшение (количество пуль) и 3 экземпляра INT. Вы не можете побить это;)

, и он работает для многих вещей: пули, эффекты частиц, эннеми, предметы, бонус, athnots :)

тривиальные вещи, которые могут быть удалены / повторно созданы часто В вашей игровой петли, вероятно, не должен быть смоделирован с использованием объектов и, безусловно, не должен быть введен в векторе ни в LinkedList.

7
ответ дан 14 December 2019 в 01:07
поделиться

Я думаю, что вы ищете/рассказываете об Объектном пуле

Из Википедии:

Объектный пул - это шаблон проектирования программного обеспечения. Объектный пул - это набор инициализированных объектов, которые хранятся готовыми к использованию, а не выделяются и уничтожаются по требованию. Объектный пул может предложить значительный прирост производительности в ситуациях, когда стоимость инициализации экземпляра класса высока, скорость инстанцирования класса высока , и количество используемых экземпляров в любой момент времени является низким .

Похоже, что вы почувствовали, как начинается проектирование пула объектов, так что он может подойти.

2
ответ дан 14 December 2019 в 01:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: