Quiero crear un juego multijugador en tiempo real simple de cliente-servidor como proyecto para mi clase de redes.
He leído mucho sobre modelos de red multijugador en tiempo real y entiendo las relaciones entre el cliente y el servidor y las técnicas de compensación de retraso.
Lo que quiero hacer es algo similar al modelo de red Quake 3: básicamente, el servidor almacena una instantánea de todo el estado del juego; Al recibir la entrada de los clientes, el servidor crea una nueva instantánea que refleja los cambios. Luego, calcula las diferencias entre la nueva instantánea y la última y las envía a los clientes, para que puedan estar sincronizadas.
Este enfoque me parece realmente sólido: si el cliente y el servidor tienen una conexión estable, solo se enviará la cantidad mínima necesaria de datos para mantenerlos sincronizados. Si el cliente no se sincroniza, también se puede solicitar una instantánea completa.
Sin embargo, no puedo encontrar una buena manera de implementar el sistema de instantáneas. Me resulta muy difícil alejarme de la arquitectura de programación para un solo jugador y pensar en cómo podría almacenar el estado del juego de tal manera que:
- Todos los datos están separados de la lógica.
- Se pueden calcular las diferencias entre la instantánea de los estados del juego
- Las entidades del juego aún pueden manipularse fácilmente a través del código
¿Cómo se implementa una clase de instantánea ? ¿Cómo se almacenan las entidades y sus datos? ¿Cada entidad cliente tiene una ID que coincida con una ID en el servidor?
¿Cómo se calculan las diferencias de instantánea?
En general: ¿cómo se implementaría un sistema de instantáneas del estado del juego?