Как вы разрабатываете систему записи / воспроизведения для часто меняющейся игры?

10

Я работаю в бесплатной MMORPG, и у меня есть проблема.

Я (вместе с другими людьми) разрабатываю систему видеозаписи для игры. Идея в основном такова: мы записываем все пакеты, отправленные и полученные с временными метками, а также некоторые локальные данные от клиента, а затем выгружаем их в файл. Для воспроизведения видео мы просто эмулируем все, что есть в файле. У нас также есть возможность экспортировать видео в avi с помощью ffmpeg.

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

Было бы полезно узнать, как другие игры справляются с этой ситуацией.

Спасибо за помощь, извините за мой английский.

Marco
источник
Просто как еще одна пища для поиска в Google / поиска: как вы это делаете, это то, как Quake Games от id записывает демонстрации, захватывая серверные пакеты. Насколько я знаю, они просто никогда не решали проблемы совместимости.
Майкл Стум
Я изменил название этого вопроса - на самом деле это не о ММО, за исключением того, что ММО - это наиболее часто меняющиеся игры.

Ответы:

8

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

coderanger
источник
В этой игре это происходит .. Пакеты добавляются, удаляются, перемещаются (например, некоторое время назад мы решили переместить все пакеты, относящиеся к GM-командам, в «расширенный пакет», это, вероятно, произойдет снова, когда мы переписываем система гильдий .. Редактирование команд / функций (изменение их функциональности) менее вероятно, но это не главное. Вы говорите, что отныне мы не должны удалять какой-либо пакет, удалять команды, просто оставляя их недоступными на стороне сервера? Спасибо за ваш ответ!
Марко
1
Да, осуждайте и оставьте их там. В конце концов старые вещи могут быть удалены, но это обычно через год или два.
Coderanger
1
Кроме того, некоторое дополнительное планирование поможет. Чем лучше вы распланируете свои пакеты сейчас, тем меньше изменений вам нужно будет сделать в будущем.
Kylotan
Проблема в том, что игра постоянно меняется. Мы добавляем новый пакет почти каждый месяц (мы добавляем новые функции). И все же, мы должны сделать много изменений в старых функциях перезаписи пакетов и т. Д. Но я думаю, что мы можем оставить методы там и подождать год, чтобы удалить их.
Марко
3
Использование более общих типов пакетов вам очень поможет. Вам не нужно добавлять новые сообщения для каждой новой функции, которую вы реализуете.
Kylotan
5

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

U62
источник
Вот как я видел это на практике: сохраняйте номер версии вместе с журналом игры. Тогда, конечно, вам также нужно хранить предыдущие версии программного обеспечения, чтобы воспроизводить предыдущие журналы, например, в хранилище исходного кода, но вам, вероятно, следует делать это в любом случае.
Ян Шрайбер
Спасибо за ваш ответ, игра бесплатная (по лицензии GPL), поэтому любой может получить доступ к старым версиям игры и даже скомпилировать клиент, чтобы не было проблем с его различными версиями. Это очень используется, не все альтернативные серверы используют последние версии, есть серверы, которые работают с 2004 года ..
Марко
@Marco: Я подозреваю, что SC2 работает так, что он помещает почти весь код в DLL. Когда он загружает воспроизведение, он проверяет версию, загружает DLL для этой версии и запускается. Это немного сложнее, но пользователю нужна только одна установка, и один exe может запустить все старые повторы.
Mooing Duck
1

Одним из способов решения этой проблемы является игра «Герои Новерта». (который меняется каждые +/- 2 недели) Из того, что я могу сказать, они:

  1. Используйте различные патчи для игры и повторов.
  2. Все повторы хранятся в облаке. Они в конце концов истекают.
  3. Если пользователь хочет посмотреть старое загруженное воспроизведение, ему сначала нужно нажать кнопку «Compatize».
  4. Похоже, что это либо удаленный diff к последней версии; или в случае, если воспроизведение больше не сохраняется, загружает его, а затем делает удаленный diff.

Поскольку я не работаю на S2, я явно не могу сказать, что это определенно так. Тем не менее, я заметил заметную тенденцию размера загрузки, связанную с возрастом воспроизведения.

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

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

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

Джонатан Дикинсон
источник