Estou programando um servidor dedicado em c # usando DLLs do BeamServer2. No começo, eu queria poder ver outros jogadores se mexendo no nosso mapa Omuni já criado. Fiz isso enviando sua posição ao servidor em cada quadro. Isso deu certo e eu pude brincar com alguns amigos, mas o movimento não foi isento de problemas. Então, comecei a tentar adicionar suavização de movimento e também alguma segurança para que eles não pudessem simplesmente enviar uma posição falsa ao servidor sem que o servidor o impedisse de alcançar outros clientes.
O que eu fiz foi criar um masterClient que possui um motionController no remotePlayer. Quando um cliente quer se mover, ele se move localmente e envia uma mensagem ao servidor com sua direção para se mover. O servidor pega a velocidade e envia para o masterClient. O masterClient que move o remotePlayer da mesma forma que o remotePlayer se move. Quando ele para de se mover, ele envia uma mensagem com sua posição. O masterclient que verifica se a posição que ele chegou é tão próxima quanto a posição que ele tem do cliente, se é realista de acordo com o ping do cliente que o servidor o coloca na posição do cliente.
Isso funciona, mas ainda tenho um problema de atraso e não tenho certeza de como corrigir isso. Devo suavizar o movimento do cliente, mas descobri que posso apenas lerp (x / 2, y / 2, z / 2) para a posição e colocá-lo na posição real no próximo quadro; falhei nisso e tentará novamente em breve. Mesmo se isso for adicionado, não tenho certeza se o lagg foi corrigido.
Quaisquer outras técnicas, sugestões, perguntas, ...? Obrigado, Diede.
fonte
A parte desafiadora da compensação de atraso é que você receberá atualizações de clientes que estão fora de serviço. O comando de um cliente atrasado enviado no momento T pode muito bem chegar após um comando do cliente não atrasado enviado em T + 40ms. A aplicação dos comandos na ordem em que você os obtém levará a todos os tipos de maldade. Fazê-lo corretamente, por outro lado, envolve retornar o tempo e reproduzir todos os comandos que foram emitidos desde então.
Não há uma maneira fácil de contornar isso, mas existem várias soluções válidas. Você pode encontrar um relativamente fácil descrito aqui .
Há muita pesquisa nesse campo, dê uma olhada!
fonte
Eu criaria o cliente como se fosse um jogo sem rede. Ou seja, qualquer coisa que você faça é imida ao cliente. Em seguida, adicione, paralelamente a isso, seu código de rede. Este código obterá os dados do movimento. Simples a partir de cabos, direção e velocidade. Apenas envia isso para o servidor que valida. O servidor envia uma posição ok ou nova.
Então você tem todo o código do cliente em execução, como se estivesse sozinho no mundo. Em seguida, apenas recebe novos dados de correção do servidor ou um ok. Se você pressionar e segurar por dez segundos, o servidor apenas receberá esses dados. Você pode considerar o envio / recebimento de dados a cada segundo, mesmo que esteja apenas pressionando o botão Avançar, caso contrário, se você atingir um pico de atraso, poderá executar para sempre.
fonte