У меня есть онлайн-игра, в которой игроки каким-то образом формируют мир, например. Жилье Ultima Online, где вы можете строить свои дома непосредственно на определенных участках карты мира. Это изменения, которые должны сохраниться со временем как часть постоянного мира.
В то же время команда разработчиков добавляет новый контент и вносит поправки в старый контент, чтобы улучшить и расширить игру для новых игроков. Они будут делать это на сервере разработки сначала во время тестирования, а затем должны объединить свою работу с «работой» игроков на живом сервере.
Предполагая, что мы исправляем проблемы с дизайном игры - например. игроки могут строить только в определенных областях, поэтому они никогда не конфликтуют географически с изменениями дизайнера - каковы хорошие способы обработки данных или организации структур данных, чтобы избежать конфликтов, когда новые данные дизайнера объединяются с данными нового игрока?
Пример 1: игрок создает предмет нового типа, и игра назначает ему идентификатор 123456. Все экземпляры этого элемента относятся к 123456. Теперь представьте, что разработчики игр имеют похожую систему, и дизайнер создает новый элемент, также пронумерованный 123456. Как этого можно избежать?
Пример 2: кто-то делает популярный мод, который дает всем вашим драконам французский акцент. Он включает в себя скрипт с новым объектом под названием, assignFrenchAccent
который они используют для назначения новых голосовых ресурсов каждому объекту дракона. Но вы собираетесь развернуть свой DLC «Наполеон против Смауга», у которого есть одноименный объект - как вы можете сделать это без особых проблем с обслуживанием клиентов?
Я подумал о следующих стратегиях:
- Вы можете использовать 2 отдельных файла / каталога / базы данных, но тогда ваши операции чтения значительно усложняются. «Показать все элементы» должен выполнить одно чтение в БД дизайнера и одно чтение в БД плеера (и все равно должен как-то различать 2).
- Вы можете использовать 2 разных пространства имен в одном магазине, например. использование строк в качестве первичного ключа и добавление к ним префикса «DESIGN:» или «PLAYER:», но создание этих пространств имен может быть нетривиальным, а зависимости неясными. (Например. В СУБД вы не сможете эффективно использовать строки в качестве первичных ключей. Вы можете использовать целые числа и распределить все первичные ключи ниже определенного числа, например, 1 миллион, для данных конструктора, а все, что выше этой точки, будет данные игрока. Но эта информация невидима для СУБД, и ссылки на внешние ключи будут пересекать «разрыв», что означает, что все инструменты и сценарии должны явно обходить ее.)
- Вы всегда можете работать с одной и той же общей базой данных в режиме реального времени, но производительность может быть низкой и риск повреждения данных игрока может быть повышен. Это также не распространяется на игры, которые работают на более чем 1 сервере с различными мировыми данными.
- ... есть другие идеи?
Мне приходит в голову, что, хотя это в первую очередь проблема для онлайн-игр, концепции могут применяться и к моддингу, когда сообщество создает моды в то же самое время, когда разработчики исправляют свою игру. Используются ли здесь какие-либо стратегии, чтобы уменьшить вероятность взлома мода при выходе новых патчей?
Я также пометил это как «контроль версий», потому что на одном уровне это то, что это - две ветви разработки данных, которые необходимо объединить. Возможно, некоторые идеи могут прийти с этого направления.
РЕДАКТИРОВАТЬ - некоторые примеры, добавленные выше, чтобы помочь прояснить проблему. Я начинаю думать, что проблема в действительности связана с пространством имен, которое может быть реализовано в магазине с помощью составных ключей. Это упрощает стратегию слияния, по крайней мере. Но могут быть альтернативы, которых я не вижу.