Концептуально, как работает воспроизведение в игре? - PullRequest
142 голосов
/ 17 июня 2010

Мне было любопытно, как в игре может быть реализовано воспроизведение.

Первоначально я думал, что будет просто список команд для каждого действия игрока / игрока, которое было предпринято в игре, и затем он «перезапускает» игру и позволяет движку рендериться как обычно. Тем не менее, я посмотрел на повторы в играх FPS / RTS, и после тщательного осмотра даже такие вещи, как частицы и графические / звуковые глюки, являются согласованными (и эти глюки обычно в согласованы).

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

Ответы [ 12 ]

59 голосов
/ 17 июня 2010

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

27 голосов
/ 29 июня 2010

Starcraft и Starcraft: Brood War имели функцию воспроизведения.После завершения матча вы можете сохранить повтор, чтобы просмотреть его позже.Во время воспроизведения вы могли прокручивать карту и нажимать на юниты и здания, но не могли изменять их поведение.

Я помню, как однажды смотрел воспроизведение матча, сыгранного в оригинальной игре, но воспроизведение былорассматривается в Brood War.Для тех, кто незнаком, Brood War содержит все оригинальные юниты и здания, а также множество новых.В оригинальной игре игрок победил компьютер, создав юниты, которые компьютер не мог легко противостоять.Когда я играл в воспроизведение в Brood War, у компьютера был доступ к различным юнитам, которые он создавал и использовал для победы над игроком.Таким образом, один и тот же файл воспроизведения приводил к другому победителю, в зависимости от того, какая версия Starcraft воспроизводила этот файл.

Я всегда находил концепцию захватывающей.Казалось бы, функция воспроизведения работала путем записи всех входов проигрывателя и предполагала, что компьютер будет реагировать на эти раздражители одинаково каждый раз.Когда входные данные игрока были поданы в исходный проигрыватель Starcraft, игра разыгралась точно так же, как и в исходном матче.Когда тот же самый точный ввод был подан в проигрыватель Brood War, компьютер реагировал по-другому, создавал более сильные юниты и выигрывал игру.

Что-то, о чем следует помнить, если вы пишете механизм воспроизведения.

17 голосов
/ 17 июня 2010

Существует два основных метода:

  1. Хранение событий (например, действий игрока / ai) - как вы и говорите.
  2. Сохранение состояния (полное состояние игры, например местоположения)объектов, в последовательные моменты).

Это зависит от того, что вы хотите сделать.Иногда лучше сохранять события, потому что это обычно занимает гораздо меньше памяти.С другой стороны, если вы хотите предоставить повторы, которые можно воспроизводить на разных скоростях и с разных начальных точек, лучше сохранять состояния.При сохранении состояний вы также можете решить, сохранять ли их после каждого события или делать это только 12 или 25 раз в секунду - это может уменьшить размер вашего воспроизведения и упростить их перемотку назад / вперед.

Обратите внимание, что«состояние» не означает графическое состояние.Больше что-то вроде позиций юнитов, состояния ресурсов и так далее.Такие вещи, как графика, системы частиц и т. Д., Как правило, являются детерминированными и могут быть сохранены как «анимация X, время Y: Z».

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

10 голосов
/ 17 июня 2010

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

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

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

Для этого потребуется, чтобы повторы просматривались последовательно , но это вполне нормально для игровых повторов (см. Starcraft 2). Если вы хотите разрешить произвольный доступ к временной шкале, вы можете делать моментальные снимки в полном состоянии с установленными интервалами (скажем, каждую минуту), чтобы прыгать по временной шкале с заданной гранулярностью.

10 голосов
/ 17 июня 2010

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

Предполагается, что бомба взорвется в точке Xчастицы, образующиеся в результате этого взрыва, всегда должны давать один и тот же визуальный результат.Если вам нужна случайность, создайте набор случайных чисел, выберите начальное значение во время игры и сохраните его в повторном воспроизведении.

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

7 голосов
/ 17 июня 2010

NVidia PhysX (механизм физического моделирования, который часто используется в играх) способен записывать полное состояние физической сцены с течением времени. Это включает в себя любые движущие входные данные от игрового движка, что означает, что вам не нужно отслеживать случайные числа семян, как предлагали другие. Если вы возьмете этот дамп сцены, вы можете воспроизвести его с помощью внешнего инструмента (предоставленного NVidia), который очень удобен для отслеживания проблем с вашими физическими моделями. Тем не менее, вы также можете использовать тот же физический поток для управления вашим графическим движком, который затем позволит вам иметь нормальное управление камерой, поскольку записывается только физика, управляющая графикой. Во многих играх это включает эффекты частиц (PhysX включает некоторые очень сложные системы частиц.) Что касается звука, я предполагаю, что он записан дословно (как звуковой поток), но я не уверен.

4 голосов
/ 17 июня 2010

Ваша оригинальная идея верна, и для действительно сложных эффектов они не запоминаются исключительно.Например, система воспроизведения Warcraft 3 не хранит состояние анимации или эффектов частиц в случае случайных эффектов и т. Д. Кроме того, MOST вещи могут быть вычислены в вычислительном отношении из начальной точки детерминистическим способом, так что для большинства системкоторые используют случайные переменные (например, взрыв частицы, который дает случайное смещение), все, что вам нужно, это время эффекта и случайное начальное число.Затем вы можете заново сгенерировать эффект, не зная, как он будет выглядеть в конечном итоге… зная, что он проходит через детерминированный путь кода.

Думая об этом чисто концептуально, чтобы воспроизвести временную шкалу событий,все, что вам нужно, это действия пользователя.Программа будет реагировать точно так же, за исключением случая случайных величин.В этом сценарии вы можете либо проигнорировать случайность (ДЕЙСТВИТЕЛЬНО ли это имеет значение, если эффекты выглядят ТОЛЬКО одинаково, либо они могут быть случайно сгенерированы случайно), либо сохранить начальное значение и подделать случайность.

3 голосов
/ 17 июня 2010

Добавьте два пенса.

Зависит от того, что вы хотите, воспроизведение может быть выполнено через

  1. Запись видео в буфер и воспроизведение позже,
  2. Захват объектаукажите каждый кадр и повторное воспроизведение позже,

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

  • , чтобы система была детерминированной симуляцией *, чтобы каждый вход генерировал согласованный и ожидаемый результат
  • , если случайностьтребуется, убедитесь, что случайные числа могут быть воспроизведены точно в более позднее время [посмотрите на засев с помощью генераторов псевдослучайных чисел PRNG или используйте случайные наборы]]и "эстетические" элементы.механические элементы влияют на результат [например, падение столбца и блокирование пути], эстетические элементы предназначены для демонстрации и не влияют на процесс принятия решений в системе [например, визуальные эффекты частиц, такие как искры].

Это действительноувлекательная темаЯ помню, что один заголовок для оригинального Xbox Wreckless имел хорошую функцию воспроизведения.К сожалению, не раз повторение повторялось;)

о да, как можно было забыть Blinx Time Sweeper ! великолепное интерактивное воспроизведение, которое было включено в действительную игровую механику!


* = кажется, что есть некоторые комментарии относительно временного перехода.Я использую «симуляцию» здесь, чтобы захватить эту функцию.по сути, ваш движок должен быть способен производить дискретные кадры времени.даже если кадр воспроизведения обрабатывается дольше или короче, чем оригинал, система должна воспринимать , что прошла та же самая дельта времени.это означает запись временного шага кадра с каждого записанного входа и подачу этой дельты на часы вашего двигателя.

2 голосов
/ 27 апреля 2013

Дэн Брайант

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

Это именно то, о чем я думал вначале, когда пытался выяснить, как они сделали так, чтобы игра повторялась всегда одинаково каждый раз. С Doom я думал о том, насколько случайными были выстрелы: D. Храните любое случайное число, привыкшее, я обнаружил, что это может быть решением. Это было до того, как я наткнулся на статью в формате PDF о технологии Crysis. Некоторые текстуры шумят там, и расположение травы или дерева, кажется, использует псевдослучайное расположение с фиксированным обратимым семенем, чтобы вы не видели измененного расположения шума, деревьев и травы в любое время, когда вы смотрите!

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

2 голосов
/ 17 июня 2010

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

Интересный вопрос. Мне было бы интересно, как это делается в профессиональных играх.

...