Qual è il vantaggio in termini di prestazioni del salvataggio di tutti i caratteri registrati negli MMO a intervalli regolari?


26

La maggior parte dei MMORPGS ha un sistema Worldsave che salverà tutti i personaggi una volta ogni X ore. Immagino che il motivo sia la prestazione. Quindi perché è meglio, dal punto di vista delle prestazioni, che salvare un personaggio in disconnessione?


34
Non è per le prestazioni; sta sacrificando un po 'di prestazioni per la correttezza , che è più importante.
Mason Wheeler

Il tempo gioca davvero qualche ruolo qui? AFAIK, ogni azione in un mmo viene salvata immediatamente. Ottieni un oggetto e quell'elemento viene aggiunto sul server senza indugio al tuo account, altrimenti il ​​server dovrebbe ricordare che l'hai fatto e quindi farlo 5 minuti dopo, il che non ha alcun vantaggio. Oppure il client dovrebbe ricordare e inviarlo 5 minuti dopo, il che ora ti apre agli hacker, perché in quei 5 minuti chiunque può modificare / aggiungere dati da inviare.
Speriamo utile

4
@HopefullyHelpful No, non è vero. Ogni azione in un MMO è immediatamente in memoria , ma è temporanea. Salvare tutto direttamente nella memoria permanente è ancora troppo costoso, anche con SSD. Anche con giochi che salvano direttamente su un database, il database stesso non salva immediatamente quei dati su disco (o almeno salva solo un registro delle transazioni, non i dati coerenti - questo deve essere ricostruito in caso di arresto anomalo e richiede un bel po 'di tempo). Ma risparmiare sulla disconnessione è una cattiva idea per un'altra ragione: la coerenza.
Luaan,

1
Ho pensato che questa domanda sarebbe stata più sulla falsariga di quale sia il vantaggio in termini di prestazioni del salvataggio dei personaggi a intervalli vs in tempo reale.
Anthony,

2
@Luaan: è perfettamente possibile salvare ogni cambiamento di stato nella memoria permanente, anche su HDD meccanici. (Potresti averne bisogno su alcuni server occupati). Il trucco è non aggiornare i singoli oggetti. Invece, si salva un registro delle transazioni "Player (A) .Inventory + = Object (B)`. Periodicamente si cancella lo stato completo. Per ripristinare, ricaricare l'ultimo salvataggio completo e applicare le transazioni più recenti dal registro delle transazioni. Dal momento che stai scrivendo un file in sequenza, raggiungi le massime prestazioni per gli HDD meccanici. Ma per mantenere il registro delle transazioni di dimensioni ragionevoli, hai bisogno dei salvataggi periodici completi
MSalters,

Risposte:


66

Questo non è per prestazioni. Questo è un fail-safe. Se il mondo risparmia ogni pochi minuti, se succede qualcosa al server e si spegne tutti perderanno i progressi di pochi minuti.

Salvando la disconnessione, se il server ha un problema, tutti perderanno tutto ciò che hanno fatto da quando hanno effettuato l'accesso. Per coloro che svolgono sessioni di gioco particolarmente lunghe (come è comune nei MMO), perderanno una quantità significativa di dati.

Sacrificano un po 'di prestazioni per rimuovere il rischio di perdita di dati di massa.

Naturalmente, è possibile archiviare facilmente i dati del giocatore sui computer client, riducendo il traffico di rete. Il problema qui è che è aperto alla pirateria informatica. Una volta che una persona capisce come imbrogliare, la condivide e tutti lo fanno.


EDIT: come sottolineato da @Philipp , questo rimuove anche la possibilità di duplicare gli oggetti. Con un sistema di salvataggio su disconnessione se viene effettuata una transazione prima di un arresto anomalo del server e una persona si disconnette prima dell'incidente, entrambi i giocatori vengono ripristinati all'ultima volta che si sono disconnessi, eliminando gli elementi o duplicandoli.


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Josh

5

I primi sistemi che salvavano solo su disconnessione tendevano anche a salvare periodicamente mentre il giocatore era attivo. In quei sistemi, in genere MUD (Multi-User Dungeons), il personaggio veniva mantenuto in memoria fino a quando non veniva periodicamente scaricato in un file.

Ciò significa che se un utente si disconnetteva senza "campeggio", di solito si trovava a diverse stanze di distanza e mancava un mucchio di bottino, XP, ecc., Dall'ultima volta che hanno salvato. A tal proposito, si è comportato in modo molto simile a come giocano i giochi di ruolo della console oggi (devi salvare il gioco senza spegnere la console o perdere tutto dall'ultima volta che hai salvato).

Il sistema ha funzionato per lo scopo previsto, poiché i personaggi non potevano interagire tra loro, tranne forse tramite un sistema di "posta" in cui potevano scambiarsi messaggi ed elementi. La possibilità di perdere oggetti e progredire tendeva ad essere piuttosto significativa, ma nella maggior parte dei casi interessava solo un personaggio alla volta.

La funzione salva-mondo è nata perché i personaggi alla fine erano in grado di interagire direttamente tra loro, quindi tutti i personaggi che giocavano dovevano essere in uno stato coerente, altrimenti si potevano verificare duplicazioni ed eliminazioni degli oggetti. Questo non era un problema nello scenario MUD, perché era difficile abusare del sistema in un modo che causava la duplicazione di oggetti o valuta, ma era incredibilmente facile da fare nei primi MUD MMO. Il giocatore A dà al giocatore B un oggetto, il giocatore B salva e il giocatore A si disconnette senza salvare. Duplicazione istantanea.

Worldsave non è un vantaggio in termini di prestazioni, ma è progettato per prevenire gli imbrogli. Ricordo di aver giocato su sistemi in cui l'evento worldsave è stato letteralmente annunciato in anticipo e spesso ha sospeso l'intero sistema per un minuto mentre il server aggiornava tutti i suoi file. Mentre questo ha impedito i truffatori, non era molto conveniente per gli utenti di questi sistemi.

Questo ci conduce allo stato attuale delle cose. Oggi non utilizziamo le funzioni di tipo worldsave. Utilizziamo database. Questo ci consente di assicurarci che la duplicazione e la cancellazione siano minimizzate il più possibile. I personaggi esistono come record in un database e ogni transazione tra giocatori è una transazione di database letterale; o l'azione è completamente impegnata o verrà ripristinata.

Escludendo i bug insoliti nel sistema, si ottengono i vantaggi del salvataggio di singoli file dei personaggi (tempi di salvataggio rapidi) e i vantaggi di salvataggi del mondo (nessun imbroglio), senza gli svantaggi di nessuno dei due (perdita di progressi significativi e duplicazione degli oggetti).

Quando si progetta un MMO moderno, si desidera creare procedure memorizzate in un database e utilizzare tali procedure per eseguire le transazioni. Ad esempio, quando fai uno scambio tra due giocatori, potrebbe apparire così:

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: questo SQL, non è scritto in modo pratico ed è pensato solo per essere un esempio).

In questo modo, se c'è un crash prima del commit, il sistema ritorna in uno stato in cui il giocatore 111 e il giocatore 333 hanno ancora gli oggetti originali, mentre dopo il commit, il commercio è completato. Non vi è alcuna possibilità di duplicazione, poiché i caratteri vengono salvati contemporaneamente, come garantito dal database.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.