¿Cuál es el beneficio de performance de save todos los caracteres registrados en MMO en intervalos regulares?

La mayoría de los MMORPGS tienen un sistema Worldsave que salvará a todos los personajes una vez cada X horas. Supongo que el motivo es el performance. Entonces, ¿por qué es mejor, en cuanto al performance, que salvar a un personaje al desconectarse?

Esto no es para el performance. Esto es a testing de fallas Si el mundo se salva cada pocos minutos, si algo le sucede al server y se apaga, todos perderán solo unos minutos de progreso.

Al save en la desconnection, si el server tiene un problema, todos perderán todo lo que han hecho desde que iniciaron session. Para aquellos en sesiones de juego especialmente largas (como es común en los MMO), perderán una cantidad significativa de datos.

Sacrifican un poco de performance para eliminar el riesgo de pérdida masiva de datos.

Por supuesto, puede almacenar fácilmente los datos del jugador en las máquinas del cliente, networkinguciendo el tráfico de la networking. El problema aquí es que está abierto a la piratería. Una vez que una persona descubre cómo hacer trampa, la comparte y todos lo hacen.


EDITAR: como señaló @Philipp , esto también elimina la capacidad de duplicar elementos. Con un sistema de save en desconnection si se realiza una transacción antes de que un server falle y una persona cierre la session antes del locking, ambos jugadores se revierten a la última vez que se desconectaron, ya sea borrando los elementos o duplicándolos.

Los primeros sistemas que solo se guardaban con la desconnection también tendían a ahorrar periódicamente mientras el reproductor estaba activo. En esos sistemas, normalmente MUD (mazmorras multiusuario), el personaje se mantenía en la memory hasta que se volcaban periódicamente a un file.

Esto significaba que si un usuario se desconectaba sin "acampar", por lo general se encontraba a varias habitaciones y echaba de less un montón de botín, XP, etc., desde la última vez que salvaron. En ese sentido, se comportaba muy parecido a cómo funcionan los juegos de rol de console (tienes que save el juego sin apagar la console, o pierdes todo desde la última vez que salvaste).

El sistema funcionaba para su propósito previsto, porque los personajes no podían interactuar entre sí, excepto posiblemente a través de un sistema de "correo" donde podían enviarse posts y elementos entre ellos. La probabilidad de perder elementos y progresar tendía a ser bastante significativa, pero solo afectaba a un personaje a la vez en la mayoría de los casos.

La function de salvar el mundo surgió porque los personajes eventualmente podían interactuar directamente entre sí, por lo que todos los personajes que se reproducían tenían que estar en un estado consistente, o podía ocurrir la duplicación y eliminación de elementos. Esto no fue un problema en el escenario de MUD, porque era difícil abusar del sistema de una manera que daba como resultado la duplicación de elementos o moneda, pero era increíblemente fácil de hacer en los primeros MMO MMO. El jugador A le da al jugador B un elemento, el jugador B guarda y el jugador A se desconecta sin save. Duplicación instantánea.

Worldsave no es un beneficio de performance, sino que está diseñado para evitar las trampas. Recuerdo haber jugado en sistemas donde el evento worldsave se había anunciado literalmente de antemano, ya menudo colgaba todo el sistema por un minuto mientras el server actualizaba todos sus files. Si bien esto evitó las trampas, no fue muy conveniente para los usuarios de estos sistemas.

Eso nos lleva al estado actual de las cosas. Hoy, no usamos funciones tipo worldsave. Usamos bases de datos. Esto nos permite asegurarnos de que la duplicación y la eliminación se minimicen lo más posible. Los caracteres existen como loggings en una database, y cada transacción entre jugadores es una transacción de database literal; o la acción está completamente comprometida o se revertirá.

Salvo errores inusuales en el sistema, obtienes los beneficios de save files de caracteres individuales (times de guardado rápidos) y los beneficios de worldsaves (sin engaños), sin los inconvenientes de ninguno (perder progreso significativo y duplicación de elementos).

Al diseñar un MMO moderno, le conviene crear procedimientos almacenados en una database y usar esos procedimientos para realizar transactions. Por ejemplo, al hacer un intercambio entre dos jugadores, podría verse así:

start transaction; insert into inventory (playerid, itemid) values (111, 222); delete from inventory where playerid=111 and itemid=444; insert into inventory (playerid, itemid) values (333, 444); delete from inventory where playerid=333 and itemid=222; commit; 

(Nota: este SQL, no está escrito de manera práctica y solo pretende ser un ejemplo).

De esta forma, si se produce un locking antes de la confirmación, el sistema retrocede a un estado en el que el jugador 111 y el jugador 333 todavía tienen los artículos originales, mientras que después de la confirmación, la operación se completa. No hay oportunidad para la duplicación, porque los personajes se guardan al mismo time, como lo garantiza la database.