2011-09-16 21 views
10

Estoy pensando en implementar un HTML5 mmog donde hay un objeto de ejecución rápida involucrado. Los jugadores cambian constantemente la dirección de ese objeto al dispararle. Pensé en WebSockets etc. (socket.io) y canvas.WebSockets rendimiento

Supongo que el cálculo del cambio de dirección debe hacerse cliente-Y en el lado del servidor y luego sincronizado-con el servidor siendo maestro para evitar hacer trampa.

Mi preocupación es que, independientemente de qué tan rápido sea el servidor, la latencia causará un retraso y, por lo tanto, eliminará la sincronización.

¿Hay una buena manera de resolver este rompecabezas? Cómo lograr la sincronización en tiempo real de esta cantidad de datos donde toda la información es fundamental para no perder un cambio de dirección. Todos los jugadores deben obtener la nueva dirección del objeto en movimiento sin demora para no dañar el juego.

Supongo que este problema se ha resuelto en los mmogs existentes.

¿Alguna idea?

+1

Puede enviar una marca de tiempo con cada acción y luego hacer que el servidor inserte la acción de manera retroactiva en el momento apropiado. (Esto no resuelve completamente su problema, ya que los jugadores pueden hacer trampa cambiando la marca de tiempo y los jugadores aún no verán el cambio hasta más tarde. Sin embargo, reducirá los problemas de retraso y no podrá transmitir los datos instantáneamente, no importa lo que haga.) – someone

+1

las marcas de tiempo basadas en el cliente nunca serán precisas. Mi reloj está a 2 minutos cuando escribo la publicación. – Marc

+0

La pregunta principal es si hay una manera de sincronizar una gran cantidad de datos, agregados a partir de pequeños mensajes (los disparos de un jugador/cambios de dirección) con una gran cantidad de conexiones, en tiempo real. – Marc

Respuesta

7

Lo mejor que puede hacer en este tipo de situaciones es tratar de predecir el movimiento del lado del cliente (cálculo a estima), y luego corregir la posición/velocidad con datos del servidor si/cuando sea necesario.

Por ejemplo, supongamos que su objeto se mueve de izquierda a derecha en la pantalla a una velocidad de 5, y un jugador dispara y cambia de dirección, moviéndose hacia arriba en la pantalla a esa velocidad de 5 (Giro de 90 grados).

La aplicación del lado del cliente probablemente se actualizará con mucha más frecuencia de la que recibe datos del servidor (por ejemplo, 60 actualizaciones por segundo desde el lado del cliente y 10 paquetes por segundo desde el servidor). Digamos que, en tiempo real, el objeto cambió de dirección con 5 fotogramas restantes antes de que llegue la actualización del servidor. En el lado del cliente, el objeto continuará moviéndose a lo largo de su trayectoria actual hasta que reciba la actualización del servidor de que cambió de dirección (es decir, no se detiene cuando no está recibiendo datos del servidor), momento en el cual el cliente corregirá la posición y la velocidad del objeto.

Cómo se hace la corrección determinará qué tan nervioso se verá la animación. Podrías arrastrarlo a la posición correcta al instante, causando un pequeño salto pero dando la posición correcta al instante, o podrías cambiar su velocidad de tal forma que se mueva en una transición suave a esa posición, sin causar ningún salto, pero teniendo una posición ligeramente inexacta durante el tiempo medio de la corrección.

Siempre tendrá algunas situaciones en las que estas correcciones terminarán siendo bastante grandes (por ejemplo, alguien tiene una conexión realmente mala, paquetes caídos, latencia altísima, etc.). Es entonces cuando obtienes las locas anomalías a las que la gente suele hacer referencia como retraso en los juegos en línea, como cuando un objeto se salta grandes distancias o se mueve muy rápido para "alcanzar" donde debería estar. Simplemente no hay forma de estar 100% sincronizado todo el tiempo. Todo lo que puedes hacer es hacer buenas conjeturas sobre dónde deberían estar las cosas.

Aquí hay algunos artículos con más detalles, ¡buena suerte!

http://gmc.yoyogames.com/index.php?showtopic=415538 http://www.gamasutra.com/view/feature/3230/dead_reckoning_latency_hiding_for_.php

+1

Hay un gran video introductorio de esta técnica de Adobe MAX 2010 - http://tv.adobe.com/watch/max-2010-develop/building-p2p-multiplayer-games/ – c69

2

El servidor es el lugar adecuado para sincronizar todos sus eventos.No desea que cada jugador envíe sus datos de entrada a los otros "n" jugadores, ya que crea demasiadas rutas de comunicación.

El servidor tomará los datos del jugador y determinará la nueva trayectoria del objeto en movimiento y luego enviará actualizaciones a cada jugador. Esto se puede hacer en unidades fijas de tiempo de juego virtual, que llamaré "ticks".

Desde el punto de servidor de vista esto le da un bucle como el siguiente:

  1. recibir entradas de jugadores
  2. estado de actualización del juego
  3. Distribuir los cambios de estado de juego a jugadores

Tendrá que lidiar con casos como no recibir información de los jugadores dentro de un cierto período de tiempo (por ejemplo, tal vez ignorar a ese jugador para ese marco).

En el lado del cliente, mientras espera la siguiente actualización del servidor, puede seguir moviendo el objeto a lo largo de su trayectoria anterior, renderizando cuadros a medida que pasa el tiempo.

Cuando se recibe una actualización del servidor para la marca del juego actual, se debe aplicar el nuevo estado del juego.

Si la nueva posición real del objeto está muy cerca de la posición que ha extrapolado, puede establecer la nueva posición y representar el siguiente cuadro.

Si la nueva posición está "lejos" de la posición extrapolada, entonces necesita decidir si desea deformar el objeto instantáneamente al destino o hacer algún tipo de movimiento acelerado o lineal para moverlo allí en un corto período de tiempo .