Atualmente, estou empreendendo um projeto bastante ambicioso. Em suma, é um jogo de estratégia multiplayer em tempo real que possui mecânica de bactérias.
Essencialmente, eu tenho dois jogadores remotos no ambiente, e eles podem gerar unidades semelhantes a bactérias que se atacam e se multiplicam, duplicando-se até que um limite de recurso seja atingido. Isso geralmente resulta em mais de 200 objetos de jogo renderizados na tela, cada um com seu próprio estado e movimento. Parece ruim, mas a jogabilidade local contra um bot é realmente muito boa, e eu consegui fazer com que ele tivesse um bom desempenho.
No entanto, o problema surge quando tento criar um jogo em rede. Já tentei seguir este guia para implementar esse recurso: http://www.paladinstudios.com/2013/07/10/how-to-create-an-online-multiplayer-game-with-unity/
Isso produz uma experiência de jogo bastante lenta e desagradável, mesmo com a melhor latência. Provavelmente, isso é causado pela necessidade de transmitir dados de movimento para centenas de unidades.
A pergunta que estou fazendo:
Como otimizar a rede e a sincronização de muitas unidades móveis entre dois clientes?
Eu já pensei em uma maneira de fazer isso. Depois de gerar uma unidade, eles só viajam em uma direção até atingirem algo - talvez eu possa sincronizar apenas quando as unidades são geradas e quando elas interagem com outro objeto? Isso teria muito benefício? Qual é a maneira ideal de implementar isso?
Agradecemos antecipadamente por respostas!
fonte
Respostas:
Para mais de 200 objetos em movimento, você definitivamente vai querer fazer o seu jogo travar. Com o locktep, surge a necessidade de determinismo, mas isso não deve ser muito difícil para as bactérias (que podem ser simuladas com colisões círculo-círculo).
Se você não se importa com meu auto-plug descarado e deseja um exemplo com a lógica de rede e simulação de um jogo de bloqueio, confira este recurso gratuitamente: https://www.assetstore.unity3d.com/en/#!/ content / 36206 . Infelizmente, essa versão não inclui todo o código-fonte, mas sinta-se à vontade para cortá-lo com minha benção;). Aqui está um vídeo de um teste inicial do DPhysics: https://www.youtube.com/watch?v=NEzOghxfMdU .
A essência do lockstep está sincronizando a entrada em vez da saída. Isso ocorre porque, com uma simulação síncrona, a única coisa que todos os clientes desconhecem são as entradas de outros clientes. O artigo que você vinculou no seu comentário explica muito bem. Não tenho certeza de como você gostaria que eu explicasse o passo a passo, então cortarei aqui e expandirei esta resposta se tiver mais alguma pergunta.
Atualização: pense nele como um servidor autorizado, exceto que o servidor envia entrada em vez do estado do jogo. Como todo jogador pode produzir o estado do jogo para si mesmo a partir da entrada, não há necessidade do servidor distribuir o estado do jogo.
fonte