Большинство MMORPGS имеют систему Worldsave, которая будет сохранять всех персонажей один раз каждые X часов. Я думаю, причина в производительности. Так почему же это лучше с точки зрения производительности, чем сохранение персонажа при отключении?
networking
mmo
databases
bunden
источник
источник
Ответы:
Это не для производительности. Это отказоустойчиво. Если мир экономит каждые несколько минут, то, если что-то случится с сервером и он отключится, все потеряют прогресс только на несколько минут.
Сохраняя при отключении, если на сервере возникла проблема, все потеряют все, что они сделали, так как они вошли в систему. Для тех, кто играет особенно долго (как это часто бывает в MMO), они потеряют значительный объем данных.
Они жертвуют небольшой производительностью, чтобы устранить риск массовой потери данных.
Конечно, вы можете легко хранить данные проигрывателя на клиентских компьютерах, уменьшая сетевой трафик. Проблема здесь в том, что она открыта для взлома. Как только один человек решает, как обманывать, он делится этим, и все это делают.
РЕДАКТИРОВАТЬ: Как отметил @Philipp , это также устраняет возможность дублирования элементов. В системе с сохранением при отключении, если транзакция выполняется до сбоя сервера, и один человек выходит из системы до сбоя, оба игрока откатываются до последнего выхода из системы, либо удаляя элементы, либо дублируя их.
источник
Ранние системы, которые сохранялись только при отключении, имели тенденцию также периодически сохранять, когда игрок был активен. В этих системах, обычно MUD (многопользовательских подземельях), персонаж сохранялся в памяти до тех пор, пока он не был периодически выгружен в файл.
Это означало, что если пользователь отключался без «кемпинга», он обычно оказывался в нескольких комнатах и пропускал кучу добычи, XP и т. Д. С момента последнего сохранения. В этом отношении он во многом напоминал то, как сегодня играют консольные РПГ (вы должны сохранить свою игру, не выключая консоль, или вы потеряете все с момента последнего сохранения).
Система работала по своему прямому назначению, потому что персонажи не могли взаимодействовать друг с другом, за исключением, возможно, посредством «почтовой» системы, где они могли отправлять сообщения и элементы друг другу. Шанс потерять предметы и прогрессировать, как правило, был довольно значительным, но в большинстве случаев затрагивал только одного персонажа за раз.
Функция сохранения мира появилась благодаря тому, что персонажи в конечном итоге могли напрямую взаимодействовать друг с другом, поэтому все играющие персонажи должны были находиться в согласованном состоянии, иначе может произойти дублирование и удаление предметов. Это не было проблемой в сценарии MUD, потому что было трудно злоупотреблять системой таким образом, что это приводило к дублированию предметов или валюты, но это было невероятно легко сделать в ранних MMO MUD. Игрок A дает игроку B предмет, игрок B спасает, а игрок A отключается без сохранения. Мгновенное дублирование.
Worldsave не является преимуществом для производительности, но предназначен для предотвращения мошенничества. Я помню, как играл в системах, где событие worldsave было объявлено буквально заранее, и часто зависало всю систему на минуту, пока сервер обновлял все свои файлы. Хотя это предотвращало мошенничество, это было не очень удобно для пользователей этих систем.
Это приводит нас к нынешнему состоянию дел. Сегодня мы не используем функции сохранения мира. Мы используем базы данных. Это позволяет нам убедиться, что дублирование и удаление сведены к минимуму. Символы существуют в виде записей в базе данных, и каждая транзакция между игроками является буквальной транзакцией базы данных; либо действие полностью совершено, либо оно будет отменено.
Исключая необычные ошибки в системе, вы получаете преимущества сохранения отдельных файлов персонажей (быстрое сохранение) и преимущества сохранения мира (без мошенничества), без недостатков (потеря значительного прогресса и дублирование предметов).
При разработке современной MMO вы хотели бы создать хранимые процедуры в базе данных и использовать эти процедуры для выполнения транзакций. Например, при торговле между двумя игроками это может выглядеть так:
(Примечание: этот SQL не написан на практике и предназначен только для примера).
Таким образом, если перед фиксацией происходит сбой, система возвращается к состоянию, в котором у игрока 111 и игрока 333 все еще есть оригинальные предметы, а после фиксации торговля завершается. Там нет возможности для дублирования, потому что символы сохраняются в то же время, как это гарантировано базой данных.
источник