Estoy interesado en evaluar las diferentes formas en que el netcode puede "engancharse" a un motor de juego. Estoy diseñando un juego multijugador ahora, y hasta ahora he determinado que necesito (al menos) tener un hilo separado para manejar los zócalos de red, distinto del resto del motor que maneja el bucle de gráficos y las secuencias de comandos.
Tenía una manera potencial de hacer que un juego en red sea de un solo subproceso, que es verificar la red después de renderizar cada cuadro, utilizando sockets sin bloqueo. Sin embargo, esto claramente no es óptimo porque el tiempo que lleva renderizar un cuadro se agrega al retraso de la red: los mensajes que llegan a través de la red deben esperar hasta que se complete el procesamiento actual del cuadro (y la lógica del juego). Pero, al menos de esta manera, la jugabilidad seguiría siendo fluida, más o menos.
Tener un hilo separado para la conexión en red permite que el juego responda completamente a la red, por ejemplo, puede enviar un paquete ACK instantáneamente al recibir una actualización de estado del servidor. Pero estoy un poco confundido acerca de la mejor manera de comunicarse entre el código del juego y el código de red. El hilo de red empujará el paquete recibido a una cola, y el hilo del juego leerá de la cola en el momento apropiado durante su ciclo, por lo que no nos hemos librado de este retraso de hasta un cuadro.
Además, parece que me gustaría que el subproceso que maneja el envío de paquetes esté separado del que está buscando paquetes que salen por la tubería, porque no podría enviar uno mientras está en el medio de comprobando si hay mensajes entrantes. Estoy pensando en la funcionalidad de select
o similar.
Supongo que mi pregunta es, ¿cuál es la mejor manera de diseñar el juego para la mejor capacidad de respuesta de la red? Claramente, el cliente debe enviar la entrada del usuario lo antes posible al servidor, para que pueda recibir el código de envío de red inmediatamente después del ciclo de procesamiento de eventos, ambos dentro del ciclo del juego. ¿Tiene esto algún sentido?