Как эффективно справиться с созданием / уничтожением многих объектов в памяти? - PullRequest
2 голосов
/ 27 августа 2011

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

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

Поэтому я подумал, что могу попытаться сохранить в памяти несколько объектов, чтобы я мог просто скопировать в них информацию и использовать их, не запрашивая у них память по требованию.Но сколько памяти я должен попытаться зарезервировать?Или я не должен беспокоиться об этом, пока на компьютере пользователя достаточно (предположительно, они будут сосредоточены на игре, а не на симуляторе погоды в фоновом режиме).

Каков наилучший способ справиться с этим?

Ответы [ 2 ]

2 голосов
/ 27 августа 2011

Краткий ответ: зависит от ожидаемого времени жизни объектов.

Обычно методы комбинируются. Объект, который является довольно статичным и который вряд ли удастся удалить или создать часто (обычно это игроки, уровни, определенные объекты на уровнях и т. Д.), Создается с помощью первого описанного вами метода (список объектов, массив, одиночный объект, и т.д.) Точный метод зависит от игры и создаваемого объекта.

Для краткосрочных объектов, таких как пули, эффекты частиц или в некоторых играх, обычно используются сами враги, например, шаблон пула объектов . Кусок памяти переворачивается в начале игры и повторно используется в течение игры для пуль и эффектных частиц. Что касается , сколько памяти я должен зарезервировать? , идеальный ответ - «Как можно меньше». К сожалению, это трудно понять иногда. Лучший способ выяснить это - угадать, сколько пуль или что-то еще вы планируете иметь на экране в любой момент времени, умножьте на два (потому что, когда вы решите, что ваш пули-адский стрелок не очень хорошо работает с только 50 пуль), а затем добавить немного буфера. Чтобы упростить его, сохраните это значение в легко понятном #define BULLET_MAX 110, чтобы вы могли изменить его, когда игра приближается к завершению, и вы можете быть достаточно уверены, что значение не будет сильно колебаться. Для дополнительного удовольствия вы можете связать значение в переменную конфигурации, и настройки графики влияют на него.

1 голос
/ 01 сентября 2011

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

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

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

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