¿“Algoritmo” de movimiento en los juegos multijugador cliente-servidor (MMO)?

He estado escribiendo un juego multijugador flash en 2D y un servidor de socket. Mi plan original para el algoritmo de movimiento entre el cliente y el servidor fue el siguiente:

El cliente informa al servidor sobre el modo de movimiento del jugador (avanzar o no moverse) y el modo de giro del jugador (no girar, girar a la izquierda o girar a la derecha) siempre que estos cambien.El servidor realiza un bucle de todos los jugadores cada pocos milisegundos y calcula el ángulo girado y la distancia recorrida, según la diferencia de tiempo. El mismo cálculo lo realiza el cliente.

Mi cálculo actual para el cliente (se usa la misma matemática en el servidor) ==>

Torneado

var newTimeStamp:uint = UtilLib.getTimeStamp(); //set current timeStamp
                var rot:uint = Math.round((newTimeStamp - turningTimeStamp) / 1000 * 90); //speed = x degrees turning every 1 second
                turningTimeStamp = newTimeStamp; //update timeStamp
                if (turningMode == 1) //left
                {
                    movementAngle = fixAngle(movementAngle - rot);
                }
                else if (turningMode == 2) //right
                {
                    movementAngle = fixAngle(movementAngle + rot);
                }

private function fixAngle(angle:int):uint //fixes an angle in degrees (365 -> 5, -5 -> 355, etc.)
        {
            if (angle > 360)
            {
                angle -= (Math.round(angle / 360) * 360);
            }
            else if (angle < 0)
            {
                angle += (Math.round(Math.abs(angle) / 360) + 1) * 360;
            }
            return angle;
        }

Movimiento

var newTimeStamp:uint = UtilLib.getTimeStamp(); //set current timeStamp
                var distance:uint = Math.round((newTimeStamp - movementTimeStamp) / 1000 * 300); //speed = x pixels forward every 1 second
                movementTimeStamp = newTimeStamp; //update old timeStamp
                var diagonalChange:Array = getDiagonalChange(movementAngle, distance); //with the current angle, howmuch is dX and dY?
                x += diagonalChange[0];
                y += diagonalChange[1];

private function getDiagonalChange(angle:uint, distance:uint):Array
        {
            var rAngle:Number = angle * Math.PI/180;
            return [Math.round(Math.sin(rAngle) * distance), Math.round((Math.cos(rAngle) * distance) * -1)];
        }

Esto parece funcionar muy bien. Para tener en cuenta el retraso, el servidor corrige la información del cliente de vez en cuando enviando estos datos.

Con este sistema se utiliza muy poco ancho de banda para manejar el movimiento. Sin embargo, las diferencias entre mi servidor y las coordenadas y ángulos del cliente son demasiado grandes. ¿Debería tal vez extender mi "algoritmo" para tener en cuenta también la latencia que tiene un usuario? ¿O hay mejores formas de manejar el movimiento en el cliente <> juegos multijugador con un gran rendimiento?

Respuestas a la pregunta(3)

Su respuesta a la pregunta