Qual é o benefício de desempenho de salvar todos os caracteres registrados nos MMOs em intervalos regulares?


26

A maioria dos MMORPGS possui um sistema Worldsave que salva todos os personagens uma vez a cada X horas. Eu acho que o motivo é o desempenho. Então, por que isso é melhor, em termos de desempenho, do que salvar um personagem na desconexão?


34
Não é para desempenho; está sacrificando um pouco de desempenho pela correção , o que é mais importante.
Mason Wheeler

O tempo realmente desempenha algum papel aqui? AFAIK, todas as ações em um mmo são salvas imediatamente. Você recebe um item e esse item é adicionado ao servidor sem demora na sua conta; caso contrário, o servidor precisaria lembrar que você fez isso e o fará 5 minutos depois, o que não tem nenhum benefício. Ou o cliente precisaria se lembrar e enviá-lo 5 minutos depois, o que agora o abrirá para hackers, porque nesses 5 minutos qualquer um pode alterar / adicionar dados a serem enviados.
que você

4
@HopfullyHelpful Não, isso não é verdade. Toda ação em um MMO fica na memória imediatamente, mas é transitória. Salvar tudo diretamente no armazenamento persistente ainda é muito caro, mesmo com SSDs. Mesmo com jogos que são salvos diretamente em um banco de dados, o próprio banco de dados não salva esses dados no disco imediatamente (ou pelo menos salva apenas um log de transações, não os dados consistentes - isso precisa ser reconstruído em caso de falha e demora bastante. pouco tempo). Mas economizar na desconexão é uma má ideia por outro motivo - consistência.
Luaan 11/08/19

11
Eu pensei que essa pergunta seria mais parecida com o benefício de desempenho de salvar caracteres em intervalos versus em tempo real.
Anthony

2
@Luaan: É perfeitamente possível salvar todas as alterações de estado em armazenamento persistente, mesmo em HDs mecânicos. (Você pode precisar de alguns em servidores ocupados). O truque é não atualizar objetos individuais. Em vez disso, salve um log de transações "Player (A) .Inventory + = Object (B)`. Periodicamente, você libera o estado completo. Para recuperar, recarrega o último salvamento completo e aplica as transações mais recentes do log de transações. . 'está escrevendo um arquivo sequencialmente, você alcança seu desempenho máximo para mecânico HDD de Mas para manter o log de transações razoável tamanho, é necessário o periódica completa salva.
MSalters

Respostas:


66

Isto não é para desempenho. Isso é à prova de falhas. Se o mundo salvar a cada poucos minutos, se algo acontecer com o servidor e ele for desligado, todos perderão apenas alguns minutos.

Ao economizar na desconexão, se o servidor tiver um problema, todos perderão tudo o que fizeram desde que fizeram o logon. Para aqueles em sessões de reprodução particularmente longas (como é comum nos MMOs), eles perderão uma quantidade significativa de dados.

Eles sacrificam um pouco de desempenho para remover o risco de perda de dados em massa.

Obviamente, você pode facilmente armazenar os dados do reprodutor nas máquinas clientes, reduzindo o tráfego na rede. A questão aqui é que ele está aberto a hackers. Depois que uma pessoa descobre como trapacear, ela a compartilha e todo mundo está fazendo.


EDIT: Como o @Philipp apontou, isso também remove a capacidade de duplicar itens. Com um sistema de salvar na desconexão, se uma transação for feita antes de uma falha no servidor e uma pessoa fizer logoff antes da falha, os dois jogadores serão revertidos para a última vez que efetuaram logout, excluindo os itens ou duplicando-os.


Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Josh

5

Os sistemas antigos que salvavam apenas na desconexão tendiam a economizar também periodicamente enquanto o player estava ativo. Nesses sistemas, geralmente MUDs (Multi-User Dungeons), o personagem era mantido na memória até serem periodicamente despejados em um arquivo.

Isso significava que, se um usuário se desconectava sem "acampar", geralmente encontrava-se a vários cômodos de distância e perdia muitos itens, XP, etc., desde a última vez que salvou. Nesse aspecto, ele se comportou muito como os RPGs de console são jogados hoje (você precisa salvar seu jogo sem desligar o console ou perde tudo desde a última vez que salvou).

O sistema funcionou para a finalidade pretendida, porque os personagens não podiam interagir entre si, exceto possivelmente por meio de um sistema de "correio" onde eles podiam enviar mensagens e itens um para o outro. A chance de perder itens e progredir tendia a ser bastante significativa, mas afetava apenas um personagem de cada vez na maioria dos casos.

O recurso de economia de mundo surgiu porque os personagens finalmente conseguiram interagir diretamente entre si, de modo que todos os personagens que estavam jogando tinham que estar em um estado consistente, ou duplicação e exclusão de itens poderiam ocorrer. Isso não foi um problema no cenário MUD, porque era difícil abusar do sistema de maneira a resultar na duplicação de itens ou moedas, mas era incrivelmente fácil de fazer nos primeiros MUDs do MMO. O jogador A dá ao jogador B um item, o jogador B salva e o jogador A desconecta sem salvar. Duplicação instantânea.

O Worldsave não é um benefício de desempenho, mas foi projetado para evitar trapaças. Lembro-me de jogar em sistemas em que o evento WorldSave foi literalmente anunciado com antecedência e, muitas vezes, paralisava todo o sistema por um minuto enquanto o servidor atualizava todos os seus arquivos. Embora isso evitasse trapaças, não era muito conveniente para os usuários desses sistemas.

Isso nos leva ao estado atual das coisas. Hoje, não usamos funções do tipo economia de mundo. Nós usamos bancos de dados. Isso nos permite garantir que a duplicação e a exclusão sejam minimizadas o máximo possível. Os caracteres existem como registros em um banco de dados, e cada transação entre jogadores é uma transação de banco de dados literal; a ação foi totalmente confirmada ou será revertida.

Exceto erros incomuns no sistema, você obtém os benefícios de salvar arquivos de caracteres individuais (tempos de economia rápidos) e os benefícios de worldsaves (sem trapaça), sem as desvantagens de ambos (perda de progresso significativo e duplicação de itens).

Ao projetar um MMO moderno, convém criar procedimentos armazenados em um banco de dados e usá-los para executar transações. Por exemplo, ao fazer uma troca entre dois jogadores, pode ser assim:

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, não foi escrito de maneira prática e deve ser apenas um exemplo).

Dessa forma, se houver uma falha antes da confirmação, o sistema reverte para um estado em que o jogador 111 e o jogador 333 ainda possuem os itens originais, enquanto após a confirmação, a troca é concluída. Não há oportunidade para duplicação, porque os caracteres são salvos ao mesmo tempo, conforme garantido pelo banco de dados.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.