El juego de centro iOS no está sincronizado

He estado construyendo un juego de centro de juegos para iOS y funciona muy bien hasta ahora. Finalmente empecé a probar el juego y theres (obviamente) algo de latencia, que está causando que el juego esté fuera de synchronization.

Básicamente tengo 2 jugadores, cada uno controlando un personaje del juego. El personaje del juego puede disparar bolas de fuego y bolas de hielo, etc. Estos ataques dañan y tienen efectos. Por ejemplo. el efecto de bola de hielo congelará al oponente por 3 segundos si hace contacto. la bola de fuego hará daño de fuego extendido durante 3 segundos.

así que el problema es que, cuando estaba jugando contra mi hermano, debido a la latencia, mi juego decía que tenía 40 puntos de vida y que estaba en 0, mientras que en su dispositivo, el juego decía que tenía 0 y tenía 20.

Esto significa que los ataques se registraron / colisionaron en un dispositivo (según las posiciones de los personajes / bolas de fuego) y no en el otro. y viceversa.

Actualmente estoy usando la architecture de centro de juego peer-to-peer pnetworkingeterminada. ¿Utilizaría una architecture cliente-server (una persona se convierte en el server) para resolver este problema fuera de synchronization?

De no ser así, ¿qué otras opciones tengo con el kit API de juego?

Encontré una solución a este problema.

Nota: esta será una respuesta relativamente larga.

Una cosa que implementé fue el uso de udp para algunas de mis transferencias de datos que no son tan importantes como otras. Por ejemplo, dado que estoy enviando datos de movimiento unas 10 veces por segundo, pensé que está bien si 1 o 2 de los 10 se pierden de vez en cuando.


Ahora al problema real:


Entonces, lo que estaba sucediendo es el siguiente, ya que estoy usando una architecture p2p , ambos clientes tienen un retraso cuando ven el juego 'mundo'. Esto significa que en mi dispositivo, veo al jugador enemigo en una position que se retrasa 100-200 mil segundos. (por lo que en realidad estaba allí 100-200 ms en el pasado).

El problema con esto es cuando dispare un proyectil contra el enemigo y veo una colisión, si la colisión fue correcta en el borde de su sprite (sus pies o cabeza), en su pantalla ya había pasado esa position, MÁS: mi bola de fuego aparece 100 ms en retardo en su pantalla. Esto significa que en su dispositivo, fue capaz de esquivar mi ataque. Esto puede suceder un número aleatorio de veces, pero creo que probablemente sea inferior al 30% del time. 70%, ambos dispositivos ven la colisión.


La solución


Lo que se me ocurrió es enviar un post al otro jugador cuando cualquiera de los dispositivos ve una colisión. Y recuerde, cada dispositivo no tiene idea si el otro vio una colisión o no. Así que no tengo forma de saber si ambos dispositivos vieron una colisión, o solo 1, y la otra vio que el ataque fue esquivado.

Esto significa que tengo que enviar un post al otro jugador cada vez que hay una colisión. Ahora, debido a la forma en que he diseñado mi juego, cuando se envía una colisión, aplico automáticamente el evento de colisión (es decir, el daño infligido, el efecto de proyectil que tuvo lugar, como congelar el jugador con el que chocó). es problemático, ya que si ambos dispositivos vieron la colisión. Eso significa que ambos dispositivos se envían el uno al otro un post de colisión, y la aplicación de colisiones de nuevo.

Para evitar esto, agregué un "número de hechizo" a cada hechizo / ataque, y cuando ocurre una colisión, guardo este número con el jugador con el que ocurrió la colisión como el "último número de hechizo de colisión". Entonces, si se produce una colisión con ese hechizo, el jugador sabe que él / ella ya ha chocado con ese object específico, por lo que la lógica de colisión no se ejecuta dos veces.