Respostas:
Como os arquivos podem ser usados para acompanhar as posições dos jogadores?
Você escreve a posição do jogador no arquivo. Por exemplo, se você identificar cada jogador com um número único (ou um GUID), poderá usá-lo como o nome do arquivo. No arquivo, basta escrever os dados da posição em um formato que você possa analisar posteriormente. Por exemplo, 467239.txt
pode conter 20, 3, 19
se o jogador # 467239 estiver no local ( x, y, z ).
Porém, isso não é tão diferente do que você faria com um banco de dados - um banco de dados não deve ser "lento" nesta operação, deve ser muito rápido (provavelmente mais rápido que os arquivos, porque você tem mais sobrecarga de IO do disco ou bloqueio de IO contenção - se você armazenou várias posições por arquivo - em uma abordagem baseada no sistema de arquivos).
Talvez você estivesse tentando usar o banco de dados ou o sistema de arquivos para armazenar a posição do player em tempo de execução ? Você não deve fazer isso .
Em tempo de execução, no servidor, as posições dos jogadores devem ser mantidas na memória e atualizadas lá, como você faria com qualquer outro tipo de jogo. Periodicamente, eles podem ser salvos no disco ou em outro armazenamento persistente - por exemplo, quando o player descansa, salva ou efetua logout.
Mas escrever todas as posições dos jogadores para armazenar todas as atualizações é desnecessário e extremamente ineficiente; nunca será rápido o suficiente para lidar com algo semelhante a balanças de jogadores "maciças".
A posição deve estar na RAM enquanto estiver em uso. (ex: o personagem do jogador está no mundo) Você não pode usar o DB como memória operacional. Bem, você pode, mas isso será terrível.
Você deve salvar as posições regularmente, mas não sempre que elas mudarem.
Eu também evitaria salvar todas as posições ao mesmo tempo. Se você quiser manter a persistência em caso de falha do servidor, salve a posição o mais rápido possível, mas no tempo livre do jogo. Simplesmente faça isso por lotes.
Salve 30 posições enquanto o tempo livre estiver disponível.
Quanto aos clientes. Eles devem receber atualizações (relevantes) do estado do jogo por meio de uma conexão com o software do servidor. Não do DB ... Isso seria impraticável, lento, ruim, mau e a força seria perturbada.
Eu tenho uma thread separada na fila para salvar em arquivos a cada 500 ou mais ticks de jogo. Caso contrário, você deve armazenar tudo na RAM.
O que faço no meu servidor é armazenar a direção dos jogadores (vetor) e a última posição. Se o jogador tiver velocidade, eu calculo a nova posição dos jogadores a cada 2 segundos.
O cliente tem sua própria posição de posição e envia uma nova direção (vetor) para o servidor.
O servidor é autoritário sobre a posição e envia um pacote de posições se o cliente se moveu a uma certa distância desde a última verificação (isso pode levar ao efeito de elástico, se o cliente estiver fora de sincronia).
Tudo isso acontece na memória, é claro.