Estou interessado em avaliar as diferentes maneiras pelas quais o netcode pode "se conectar" a um mecanismo de jogo. Estou projetando um jogo multiplayer agora e até agora concluí que preciso (pelo menos) de um thread separado para lidar com os soquetes de rede, distinto do restante do mecanismo que lida com o loop e o script gráficos.
Eu tinha uma maneira potencial de criar um jogo em rede inteiramente de thread único, ou seja, verificar a rede depois de renderizar cada quadro, usando soquetes sem bloqueio. No entanto, isso claramente não é ideal porque o tempo necessário para renderizar um quadro é adicionado ao atraso na rede: As mensagens que chegam pela rede devem esperar até que a renderização do quadro atual (e a lógica do jogo) seja concluída. Mas, pelo menos assim, a jogabilidade ainda permaneceria suave, mais ou menos.
Ter um encadeamento separado para rede permite que o jogo seja totalmente responsivo à rede, por exemplo, pode enviar de volta um pacote ACK instantaneamente após o recebimento de uma atualização de estado do servidor. Mas estou um pouco confuso sobre a melhor maneira de me comunicar entre o código do jogo e o código da rede. O encadeamento de rede empurrará o pacote recebido para uma fila, e o encadeamento do jogo será lido na fila no momento apropriado durante o loop, portanto, não nos livramos desse atraso de um quadro.
Além disso, parece que eu gostaria que o encadeamento que lida com o envio de pacotes fosse separado daquele que está verificando pacotes descendo pelo canal, porque não seria capaz de enviar um enquanto estiver no meio de verificando se há mensagens recebidas. Estou pensando na funcionalidade select
ou similar.
Acho que minha pergunta é: qual é a melhor maneira de projetar o jogo para obter a melhor capacidade de resposta da rede? Claramente, o cliente deve enviar a entrada do usuário o mais rápido possível para o servidor, para que eu possa ter o código de envio de rede imediatamente após o loop de processamento do evento, ambos dentro do loop do jogo. Isto faz algum sentido?