Estoy trabajando en un simulador de combate espacial que tiene lugar en áreas relativamente vastas (un cubo de espacio ~ 20 minutos luz por lado) y utiliza (en su mayoría) física realista. Uno de los elementos clave que quiero modelar es la velocidad de propagación de la información en el espacio de batalla, es decir, si el jugador A activa su impulso principal en un lado del espacio de batalla, hay un retraso de 20 minutos antes de que el jugador B lo vea y puede reaccionar a eso
Incluso para espacios de batalla relativamente pequeños, este es un factor importante dada la velocidad involucrada. Un barco de 500 m de longitud que haga 30kps se desplazará por completo en 1/60 de segundo, por lo que incluso atacar a un oponente a solo unas décimas de segundo de luz se verá afectado por el retraso de la luz.
No he visto esto antes, y me pregunto si hay algunas mejores prácticas para modelar esto. En este momento estoy marcando la hora de cada evento y marcándolo con una ubicación, poniéndolo en una cola, y luego cada marca comprobando para ver si alguno de los objetos en el mundo del juego está nuevamente en el borde del cono de luz y agrego el evento a su cola de sensores. Lo optimizaré (pero aún no lo he hecho) eliminando cualquier evento que ya haya sido detectado por todos los objetos que posiblemente puedan sentirlo, pero aún así, creo que esto se volverá bastante engorroso y comerá mucho de ciclos si hay cientos de objetos de detección en juego (lo cual es bastante rutinario).
¿Hay modelos de datos que serían más adecuados para esto que debería consultar?
fuente
Respuestas:
Solo lluvia de ideas aquí ...
Curiosamente, el retraso de la red es tu amigo en este caso. Como desea que ocurra un retraso para algunos paquetes de datos, al menos si se trata de dibujar. Pero en lugar de un retraso base que cada jugador normalmente tendría para todos los paquetes de datos afectados solo por la velocidad de su red, debe aplicar un retraso específico para cada evento a cada jugador en función del retraso de la velocidad de la luz.
Por lo general, el servidor enviaría actualizaciones a todos los clientes al mismo tiempo, pero lo que necesita es que el servidor calcule el "retraso ligero" para cada evento (en función de la distancia del espectador) y luego no envíe una actualización hasta que hora.
Por lo tanto, para cada evento, calcule el retraso de tiempo entre el evento y cada jugador, luego ponga en cola ese evento para que no se envíe al sorteo hasta que haya pasado el tiempo de retraso.
Esto no aborda el efecto del cambio de posición o velocidad del jugador después de que ocurra el evento, pero podría ajustar los eventos que se habían puesto en cola en función de los cambios del jugador. Un jugador comienza a acercarse, acercar el evento a tiempo. El jugador se aleja, se aleja a tiempo.
El cambio Doppler sería algo interesante para incluir en la mezcla, en función del delta de movimiento entre el espectador y el evento.
fuente
La pregunta es: ¿qué tan exacta necesita que sea su imagen retrasada para que se desarrolle realmente? Si está buscando una precisión del 100%, necesitará guardar las acciones o el estado de cada objeto en el mapa en cada tic y, como usted dice, reproducirlos en un retraso basado en la distancia. Si no le importa mucho la precisión, que rara vez necesita en los juegos, puede guardar el estado a intervalos y extrapolar entre ellos cuando se recupere el retraso. Puede optimizar no guardando actualizaciones idénticas.
Alternativamente, puede vectorizar todo el movimiento y guardar una ruta para cada objeto junto con un tiempo de inicio visto desde un observador universal. Luego puede calcular la posición esperada de un objeto para cada observador en función del contador de tiempo universal y la hora local en función de los nodos de ruta que ha guardado. Cuando la marca de tiempo de un nodo de ruta va detrás de la luz de todos los objetos relevantes, la descartas.
Editar: lo anterior supone que vas a hacer trampa en la relatividad básica al tener un observador absoluto (supongo que el jugador). Esto le robaría algunos de los aspectos más interesantes de la dilatación del tiempo, pero modelarlos sería un proyecto en sí mismo> _>
fuente