Los primeros sistemas que guardaban solo en desconexión tendían a guardar también periódicamente mientras el jugador estaba activo. En esos sistemas, típicamente MUD (mazmorras multiusuario), el personaje se mantuvo en la memoria hasta que se volcaron periódicamente a un archivo.
Esto significaba que si un usuario se desconectaba sin "acampar", generalmente se encontraban a varias habitaciones de distancia y faltaban un montón de botín, XP, etc., desde la última vez que guardaron. En ese sentido, se parecía mucho a cómo juegan los juegos de rol de la consola hoy en día (tienes que guardar tu juego sin apagar la consola, o pierdes todo desde la última vez que guardaste).
El sistema funcionó 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 mensajes y elementos entre ellos. La posibilidad de perder elementos y progresar tiende a ser bastante significativa, pero solo afecta a un personaje a la vez en la mayoría de los casos.
La función de ahorro de mundo surgió porque los personajes eventualmente pudieron interactuar directamente entre sí, por lo que todos los personajes que jugaban tenían que estar en un estado consistente, o podría ocurrir la duplicación y eliminación de elementos. Esto no fue un problema en el escenario MUD, porque era difícil abusar del sistema de una manera que resultó en la duplicación de artículos o divisas, pero fue increíblemente fácil de hacer en los primeros MUD MUD. El jugador A le da al jugador B un elemento, el jugador B guarda y el jugador A se desconecta sin guardar. Duplicación instantánea
Worldsave no es un beneficio de rendimiento, sino que está diseñado para evitar trampas. Recuerdo haber jugado en sistemas en los que el evento WorldSave se anunciaba literalmente por adelantado y, a menudo, colgaba todo el sistema durante un minuto mientras el servidor actualizaba todos sus archivos. Si bien esto evitó las trampas, no fue muy conveniente para los usuarios de estos sistemas.
Eso nos lleva a la situación actual. Hoy, no usamos funciones de tipo salvavidas. Usamos bases de datos. Esto nos permite asegurarnos de que la duplicación y eliminación se minimicen tanto como sea posible. Los personajes existen como registros en una base de datos, y cada transacción entre jugadores es una transacción de base de datos literal; o la acción está totalmente comprometida o se revertirá.
Salvo errores inusuales en el sistema, obtienes los beneficios de guardar archivos de personajes individuales (tiempos de guardado rápidos) y los beneficios de los salvavidas (sin trampas), sin los inconvenientes de ninguno de ellos (pérdida de progreso significativo y duplicación de elementos).
Al diseñar un MMO moderno, querrá crear procedimientos almacenados en una base de datos y usar esos procedimientos para realizar transacciones. 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 manera, si hay un bloqueo antes de la confirmación, el sistema regresa a un estado en el que el jugador 111 y el jugador 333 todavía tienen los elementos originales, mientras que después de la confirmación, el intercambio se completa. No hay oportunidad para la duplicación, porque los caracteres se guardan al mismo tiempo, como lo garantiza la base de datos.