Estoy programando un servidor dedicado en C # usando BeamServer2 DLL's. Al principio quería ver a otros jugadores moverse en nuestro mapa Omuni ya hecho. Esto lo hice simplemente enviando su posición al servidor cada trama. Esto funcionó y pude jugar con algunos amigos, pero el movimiento no fue lento. Así que comencé a tratar de agregar suavizado de movimiento y también algo de seguridad para que no puedan enviar una posición falsa al servidor sin que el servidor impida que llegue a los otros clientes.
Lo que hice, hice un masterClient que tiene un control de movimiento en el RemotePlayer. Cuando un cliente quiere moverse, se mueve localmente y envía un mensaje al servidor con la dirección de moverse. El servidor que toma su velocidad y lo envía al masterClient. El MasterClient que mueve el RemotePlayer al igual que el RemotePlayer se mueve a sí mismo. Cuando deja de moverse, envía un mensaje con su posición. El cliente maestro que comprueba si la posición a la que ha llegado es tan cercana como la posición que tiene del cliente, si es realista de acuerdo con el ping del cliente, el servidor lo coloca en la posición del cliente.
Esto funciona, pero todavía tengo un problema de retraso y no estoy seguro de cómo solucionarlo. Debo hacer movimientos suaves en el cliente, pero descubrí que solo puedo saltar (x / 2, y / 2, z / 2) a la posición y colocarlo en la posición real el próximo cuadro, fallé en eso y yo Lo intentaremos nuevamente pronto. Incluso si se agrega eso, no estoy seguro de si el retraso está reparado.
¿Alguna otra técnica, sugerencia, pregunta, ...? Gracias Diede.
fuente
La parte desafiante en la compensación de retraso es que recibirá actualizaciones de clientes que están fuera de servicio. El comando de un cliente laggy enviado en el momento T puede muy bien llegar después de un comando del cliente no laggy enviado a T + 40ms. La aplicación de los comandos en el orden en que los obtienes dará lugar a todo tipo de maldad. Hacerlo correctamente, por otro lado, implica reducir el tiempo y volver a reproducir todos los comandos que se han emitido desde entonces.
No hay una manera fácil de evitar esto, pero hay varias soluciones válidas. Puede encontrar uno relativamente fácil descrito aquí .
Hay mucha investigación en este campo, ¡echa un vistazo!
fuente
Crearía el cliente como si fuera un juego sin red. Es decir, todo lo que hagas lo haces de forma inmediata en el cliente. Luego agregue, paralelo a eso, su código de red. Este código obtendrá los datos de movimiento. Simple como de coords, dirección y velocidad. Simplemente envía esto al servidor que valida. El servidor le envía un ok o una nueva posición.
Entonces, tiene todo su código de cliente ejecutándose como si estuviera solo en el mundo. Luego solo recibe nuevos datos de corrección del servidor o un ok. Si presiona hacia adelante y lo mantiene presionado durante diez segundos, el servidor solo recibirá esos datos. Puede pensar en enviar / recibir datos cada segundo a pesar de que solo está presionando el botón de avance, o si golpea un pico de retraso podría correr para siempre.
fuente