Мне было немного любопытно, как воспроизведение может быть реализовано в игре.
Сначала я думал, что будет просто список команд для каждого действия игрока / игрока, которое было предпринято в игре, а затем он «перезапускает» игру и позволяет механизму рендеринга как обычно. Тем не менее, я посмотрел на повторах в FPS / RTS игры, и после тщательного осмотра даже такие вещи , как частицы и графические / звуковые глюки последовательны (и эти глюки , как правило , в последовательной).
Итак, как это происходит. В играх с фиксированным углом обзора камеры, хотя я мог бы просто записать каждый кадр всей сцены в поток, который был сохранен, а затем просто воспроизвести поток назад, но этого недостаточно для игр, которые позволяют вам останавливать и перемещать камеру вокруг. Вы должны были бы хранить местоположения всего на сцене во все моменты времени (нет?). Так что для таких вещей, как частицы, нужно нажать много данных, что кажется значительным снижением производительности игры во время игры.
источник
Ответы:
Я думаю, что ваша первоначальная мысль была правильной. Чтобы создать повтор, вы сохраняете все входные данные, полученные от пользователя (вместе с номером кадра, на котором он был получен), а также начальные начальные числа любых генераторов случайных чисел. Чтобы воспроизвести игру, вы сбрасываете свои PRNG, используя сохраненные начальные числа, и подаете игровой движок ту же последовательность ввода (синхронизированную с номерами кадров). Поскольку многие игры обновляют игровое состояние в зависимости от времени, которое проходит между кадрами, вам также может потребоваться сохранить длину каждого кадра.
источник
Starcraft и Starcraft: Brood War имели функцию воспроизведения. После завершения матча вы можете сохранить повтор, чтобы просмотреть его позже. Во время воспроизведения вы можете прокручивать карту и нажимать на юниты и здания, но не можете изменять их поведение.
Я помню, как однажды смотрел повтор матча, сыгранного в оригинальной игре, но этот просмотр просматривался в Brood War. Для незнакомых людей Brood War содержит все оригинальные юниты и здания, а также множество новых. В оригинальной игре игрок победил компьютер, создав юниты, которые компьютер не мог легко противостоять. Когда я играл в воспроизведение в Brood War, у компьютера был доступ к различным юнитам, которые он создавал и использовал для победы над игроком. Таким образом, один и тот же файл воспроизведения приводил к другому победителю в зависимости от того, какая версия Starcraft воспроизводила файл.
Я всегда находил концепцию увлекательной. Казалось бы, функция воспроизведения работала путем записи всех входов проигрывателя и предполагала, что компьютер будет реагировать на эти раздражители одинаково каждый раз. Когда входные данные игрока были поданы в исходный проигрыватель Starcraft, игра разыгралась точно так же, как и в исходном матче. Когда один и тот же точный ввод был подан в проигрыватель Brood War, компьютер реагировал по-другому, создавал более сильные юниты и выигрывал игру.
Что-то, о чем нужно помнить, если вы пишете движок воспроизведения.
источник
Есть два основных метода:
Это зависит от того, что вы хотите сделать. Иногда лучше хранить события, потому что обычно это занимает гораздо меньше памяти. С другой стороны, если вы хотите предоставить повторы, которые можно воспроизводить на разных скоростях и с разных начальных точек, лучше сохранять состояния. При сохранении состояний вы также можете решить, сохранять ли их после каждого события или, например, только 12 или 25 раз в секунду - это может уменьшить размер вашего воспроизведения и упростить их перемотку назад / вперед.
Обратите внимание, что «состояние» не означает графическое состояние. Больше что-то вроде позиций юнитов, состояния ресурсов и так далее. Такие вещи, как графика, системы частиц и т. Д., Обычно являются детерминированными и могут быть сохранены как «анимация X, время Y: Z».
Иногда повторы используются в качестве антихитирующей схемы. Тогда хранение событий здесь, наверное, лучшее.
источник
Технически вы должны написать свой движок, чтобы быть детерминированным, а не случайностью. Предполагая, что персонаж в игре нацеливается на руку противника и стреляет из оружия, тогда противнику должно быть нанесено одинаковое количество урона во всех случаях.
Предполагая, что бомба детонирует в точке X, частицы, образовавшиеся в результате этого взрыва, всегда должны давать один и тот же визуальный результат. Если вам нужна случайность, создайте набор случайных чисел, выберите начальное значение во время игры и сохраните его в повторном воспроизведении.
Вообще случайность в игре - плохая идея. Даже для таких вещей, как мультиплеер, вы не можете иметь половину своих игроков, способных видеть вокруг взрыв, в то время как другие не могут просто, потому что они не получили правильное случайное значение.
Сделайте все детерминированным, и у вас все будет хорошо.
источник
Учитывая начальное состояние и серию действий с отметками времени , просто пройдите последовательность, поскольку записанные действия, как предполагается, должны иметь повтор.
Чтобы повторяющиеся события происходили точно так же, используйте псевдослучайные числа с семенами и сохраните начальное число в файле воспроизведения.
До тех пор, пока вы используете тот же алгоритм для генерации случайных чисел из начального числа, вы можете воссоздать все события так же, как они произошли в живой игре, не требуя полных снимков состояния игры.
Это потребует последовательного просмотра повторов , но это вполне нормально для игровых повторов (см. Starcraft 2). Если вы хотите разрешить произвольный доступ к временной шкале, вы можете делать снимки полного состояния через заданные интервалы (скажем, каждую минуту), чтобы прыгать по временной шкале с заданной гранулярностью.
источник
NVidia PhysX (движок физического моделирования, который часто используется в играх) способен записывать полное состояние физической сцены с течением времени. Это включает в себя любые движущие входы от игрового движка, что означает, что вам не нужно отслеживать случайные числа семян, как предлагали другие. Если вы берете этот дамп сцены, вы можете воспроизвести его с помощью внешнего инструмента (предоставленного NVidia), который очень удобен для отслеживания проблем с вашими физическими моделями. Тем не менее, вы также можете использовать тот же физический поток для управления вашим графическим движком, что позволит вам иметь нормальное управление камерой, поскольку записывается только физика, управляющая графикой. Во многих играх это включает эффекты частиц (PhysX включает некоторые очень сложные системы частиц.) Что касается звука, я предполагаю, что это записано дословно (как звуковой поток), но я '
источник
Ваша оригинальная идея верна, и для действительно сложных эффектов они не запоминаются исключительно. Например, система воспроизведения Warcraft 3 не хранит состояние анимации или эффектов частиц в случае случайных эффектов и т. Д. Кроме того, МОСТ-вещи могут быть вычислены вычислительно из начальной точки детерминистическим способом, так что для большинства систем которые используют случайные переменные (например, взрыв частицы, который дает случайное смещение), все, что вам нужно, это время эффекта и случайное начальное число. Затем вы можете заново сгенерировать эффект, не зная, как он будет выглядеть в конечном итоге… зная, что он проходит через детерминированный путь кода.
Думая об этом чисто концептуально, чтобы воспроизвести временную шкалу событий, все, что вам нужно, это действия пользователя. Программа будет реагировать точно так же, за исключением случая случайных величин. В этом сценарии вы можете либо проигнорировать случайность (ДЕЙСТВИТЕЛЬНО ли это имеет значение, если эффекты выглядят ТОЧНО одинаково, либо они могут быть случайно сгенерированы заново), либо сохранить начальное значение и подделать случайность.
источник
Брось мои два пенса.
Зависит от того, что вы хотите, воспроизведение может быть выполнено через
В большинстве случаев люди хотят интерактивного воспроизведения, поэтому 2. это путь. Тогда, в зависимости от ваших ограничений, есть несколько способов оптимизировать этот процесс.
Это действительно увлекательная тема. Я помню одно название для запуска оригинальной Xbox Wreckless имел хорошую функцию воспроизведения. К сожалению, в более чем одном случае повтор будет облажаться;)
о да, как можно забыть Blinx Time Sweeper ! отличный интерактивный повтор, который был включен в настоящую игровую механику!
* = Кажется, есть некоторые комментарии относительно временного перехода. Я использую «симуляцию» здесь, чтобы захватить эту функцию. по сути, ваш движок должен быть способен производить дискретные кадры времени. даже если кадр воспроизведения обрабатывается дольше или короче, чем оригинал, система должна понимать, что прошло то же время. это означает запись временного шага кадра с каждого записанного входа и подачу этой дельты на часы вашего двигателя.
источник
Возможно, вы могли бы просто сохранить стек команд, отправляемых каждым игроком. Таким образом, вместо сохранения того, что бомба взорвалась в определенный момент и время, или что определенная машина уничтожена, вы просто сохраняете нажатия клавиш, посылаемые каждым игроком. Затем, при воспроизведении, вы просто моделируете игру, как это было бы с этими нажатиями. Я чувствую, что у этого есть потенциал, чтобы занять меньше места, но я никогда не работал над такой системой воспроизведения.
Интересный вопрос, хотя. Мне было бы интересно, как это делается в профессиональных играх.
источник
Дэн Брайант
Это именно то, о чем я думал вначале, когда пытался выяснить, как они это сделали, чтобы игра повторялась всегда одинаково каждый раз. С Doom я думал о том, насколько случайными были выстрелы: D. Храните любое случайное число, привыкшее, я обнаружил, что это может быть решением. Это было до того, как я наткнулся на статью в формате PDF о технологии Crysis. Некоторые текстуры шумят там, и расположение травы или дерева, кажется, использует псевдослучайное расположение с фиксированным обратимым семенем, чтобы вы не видели измененного расположения шума, деревьев и травы в любое время, когда вы смотрите!
Избегая в то же время, хранить миллионы деревьев и травяные валы. По-видимому, псевдослучайная последовательность может воспроизводить одно и то же в любое время, поскольку логика фиксирована, чтобы просто создать поддельную статистически случайную последовательность чисел.
источник
Проблема наличия последовательного повторения такая же (ну, проще), как и постоянная многопользовательская игра.
Как уже упоминалось ранее, повторы в играх RTS сохраняются путем записи всех входных данных (что имеет эффект. Прокрутка не имеет никакого эффекта.) Многопользовательский режим также передает все входные данные.
Запись всех входных данных - не просто предположение - есть библиотека для чтения повторов Warcraft3, которая показывает это.
ввод включает временные метки для этого ответа.
источник
Я полагаю, что с определенными приращениями игра будет делать снимок состояния всего (ВСЕ). Затем, когда происходит воспроизведение, можно использовать простую линейную интерполяцию, чтобы заполнить «дыры». По крайней мере, я так думаю.
Вы правы в том, что запись входных данных будет ненадежной / не гарантирует одинаковый выход. В игре обязательно нужно отслеживать состояние всех объектов (или, по крайней мере, важных)
источник