Si aún no lo ha hecho, le sugiero que lea estos dos artículos profundos pero comprensibles: https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking y http://fabiensanglard.net/quake3/network.php .
Estos explican por qué se recomienda utilizar el envío de paquetes de 'intervalo fijo'. Para ser breve, de hecho, es principalmente importante para los paquetes enviados por el servidor.
El envío de un paquete tiene un costo fijo, y el tamaño máximo de un paquete de red es de aproximadamente 1.5 KB. Entonces, si tiene, por ejemplo, 16 jugadores en su servidor, cada cuadro cuando calcule el movimiento de un jugador, el código ingenuo podría enviar un paquete de actualización a cada jugador después de cada resolución de movimiento, por lo que 16 * 16 = 256 paquetes. Si tiene un framerate de 30, eso es 7680 paquetes.
Un mejor enfoque es crear un búfer en cada inicio del cuadro, concatenar en él la actualización de sus 16 posiciones calculadas y luego enviarlas a sus 16 jugadores.
Ahora envía solo 480 paquetes por segundo para obtener los mismos resultados.
En el caso de jugador a servidor, eso solo significa que debe enviar, en el mismo paquete, un máximo de datos, como; posición buscada, acciones llamadas este marco y así sucesivamente.
Acerca de la segunda parte de su pregunta: la forma en que elegí reducir la sensación de retraso fue enviar esta información al servidor en cada cuadro:
posición actual real del jugador (utilizada por el servidor para verificar si las posiciones del lado del servidor y del lado del jugador no están demasiado desincronizadas).
Posición estimada del jugador en 1 segundo: calculada por el cliente: si el jugador no cambia la dirección del mouse y deja el teclado en su estado actual durante 1 segundo, ¿dónde estará el jugador? (no nos importan las colisiones) Si el jugador no se mueve, su posición estimada en 1 segundo es su posición actual.
La posición que mira.
Cada vez que el servidor recibe esta información, actualiza la posición futura y la posición buscada, y la entidad del jugador finalmente se mueve hacia su posición futura.
Los jugadores nunca se sincronizan exactamente, pero la respuesta de entrada es instantánea (lo más importante para mí) y descubrí que las posiciones predichas son lo suficientemente precisas para mí.