Tengo de 2 a 3 clientes que pueden intercambiar mensajes a través de Apple Game Center.
La única sincronización que necesito es: iniciar el juego en el mismo momento.
Supongo que esto implica la sincronización del reloj. ¿Cómo lograr esto?
networking
multiplayer
game-center
GameCoder
fuente
fuente
now
y envía un mensaje para comenzar exactamente ennow + halfSecond
ese momento, siempre y cuando todos reciban el mensaje dentro de medio segundo, y mientras sus relojes del sistema estén sincronizados correctamente, todos comenzarán al mismo tiempo.Respuestas:
El comentario de Steven es correcto: esto es teóricamente imposible de hacer.
Afortunadamente, en la práctica puedes acercarte, que es cómo funcionan cosas como NTP .
Por ejemplo, mejor que simplemente enviar un mensaje a 3 clientes diciendo "comenzar ahora", puede intercambiar un par de mensajes de ping de antemano para medir el tiempo que lleva enviar un mensaje al cliente, y cuando envía el mensaje de inicio, en lugar de "comenzar ahora" diga "comenzar en X milisegundos" y ajuste X para los diferentes tiempos que tarda un mensaje en llegar.
p.ej.:
Esto no puede garantizar la sincronización porque el tiempo necesario para enviar un mensaje a través de Internet varía, y porque puede ser diferente en cada dirección. El primero puede reducir los efectos realizando la medición varias veces y tomando una lectura mediana. El segundo es más complicado y puede ser teóricamente imposible de resolver (aunque no puedo recordar la prueba en este momento). La buena noticia es que probablemente no necesites tanta precisión.
fuente
Como se mencionó, esto es imposible, así que probaría otro enfoque:
Si no tiene un servidor dedicado, elija un cliente participante para que se convierta en el host (esto se puede transferir si es necesario).
El anfitrión ahora realizará toda la lógica importante del juego, como detección de golpes, controles de IA, manejo de inventario, etc., así como el seguimiento del tiempo (es decir, dictar el tiempo del juego).
Los otros clientes solo intentarán mantenerse sincronizados con el host, tratando de estimar o aproximar el valor esperado. Si el retraso aumenta o hay una pérdida de paquetes, las cosas pueden volverse entrecortadas, pero es trivial ponerse al día, esencialmente esperando la próxima actualización.
La mayoría de los juegos (especialmente FPS) ocultan este hecho al hacer su propio cálculo local para el propio movimiento del jugador, disparos, etc. para evitar que el juego se sienta lento. Todo aún se corrige en función de los datos del servidor. Esto puede generar cierta confusión, por ejemplo, te ves disparando al enemigo, pero en el mismo momento que caes muerto (sin que el enemigo reciba un golpe), pero sigue siendo un enfoque mucho mejor que la sincronización completa.
Si aún insiste en mantener todo sincronizado, es probable que desee crear algún tipo de paso o contador de trama, para que todos los clientes solo procesen un paso lógico, luego sincronicen sus datos, etc. Tenga en cuenta que esto puede ser ancho de banda intensivo y lento, por lo que no recomendaría hacerlo a menos que tenga muchos datos de otra manera y su juego esté basado en turnos (por ejemplo, juegos de estilo Artillery / Worms).
fuente
Recomiendo sincronizar los temporizadores del sistema en todos los clientes y el servidor mediante el protocolo NTP [Stratum 2], luego el servidor envía un comando para iniciar el juego a la hora especificada, digamos, cuando todos los temporizadores alcanzan las 0:05:00. Este enfoque debería darle una sincronización precisa de 3-4 ms, creo.
fuente