Estoy implementando un servidor de juegos que admite el combate cuerpo a cuerpo similar a Star Control . Entonces tienes barcos volando y disparando, con física súper simple de velocidad / aceleración / amortiguación para impulsar el movimiento.
Leí Valve, Gafferon y Gambetta e implementé el algoritmo de Gambetta para la predicción del cliente:
La predicción del cliente funciona en el barco del jugador actualizando su posición desde el servidor tal como viene y luego volviendo a aplicar la entrada aún no procesada por el servidor al barco del jugador.
Desafortunadamente, no funciona bien para mi juego. Creo que tiene que ver con el hecho de que el ejemplo de Gambetta no tiene en cuenta los objetos que ya se están moviendo o los comandos que se actualizan paso a paso. (por "paso" quiero decir marco). Entonces, en mi juego, el jugador presiona hacia arriba para acelerar la nave (ya en movimiento), que continúa moviéndose en el cliente, envía el comando al servidor y generalmente recibe la instantánea mundial del servidor en el siguiente paso. Tengo algo más como:
El comando del reproductor se ejecuta en el paso 3 del cliente , pero en el servidor solo se ejecuta en el paso 5 del servidor . Para cuando el cliente recibe la instantánea mundial en el paso 6 del cliente , la predicción está muy lejos, especialmente en velocidades más rápidas.
El quid del problema es que el cliente ejecuta el comando en el paso 5 , pero el servidor lo ejecuta en el paso 6 . Pensé en enviar el paso del cliente con el comando y hacer que el servidor retroceda y vuelva a ejecutar el comando con el paso de tiempo del cliente. Sin embargo, eso podría conducir a una serie de otros problemas, como lo que sucede con los comandos recibidos desde la reversión, o cómo los clientes engañadores pueden explotar cambiando el paso enviado.
Leer y mirar videos como este de Google menciona un enfoque diferente, donde cambia gradualmente la posición del jugador para que coincida con la de la instantánea en unos pocos pasos.
Mis preguntas:
¿Puedes hacer que el algoritmo de Gambetta funcione con movimientos constantes? ¿O es conceptualmente incompatible con mi juego?
¿Es la interpolación gradual sobre los pasos el camino correcto a seguir entonces? Si es así, ¿cómo interpola un objeto ya en movimiento desde la posición del cliente para que coincida con el que acaba de recibir del servidor?
¿Pueden estos métodos, la interpolación gradual y el algoritmo de Gambetta funcionar en conjunto, o son mutuamente excluyentes?