2011-08-20 20 views
5

Estoy trabajando en un proyecto para aprender node.js, y estaba buscando sugerencias sobre cómo manejar la sincronización de datos de usuario en tiempo real .Sugerencias de patrones de diseño para sincronizar datos de múltiples usuarios en un juego en línea en tiempo real

Digamos que tiene un mapa rectangular en 2D (aproximadamente 600x400), con un número de jugadores ocupando las posiciones x, y en ese mapa. Cada usuario puede navegar con las teclas de flecha e interactuar con los demás de una manera básica. Dado que esto se jugaría a través de HTTP, ¿cuál sería el mejor patrón de diseño en términos de manejo y sincronización de los datos del usuario para brindar la experiencia más fluida y fluida?

puedo pensar en varias opciones, pero agradecería un poco más las ideas/aclaraciones:

  1. El cliente envía los datos de posición al servidor, el servidor distribuye a todas las posiciones de todos los clientes, la pantalla se representa con el resultado. Repetir. La desventaja sería que el lado del cliente está rezagado por el tiempo que lleva un viaje de ida y vuelta de datos, pero lo bueno es que se sincronizan con todos los usuarios.

  2. Cliente representa donde cree que está constantemente, envía datos posicionales al servidor, el servidor distribuye todas las posiciones a todos los clientes, y luego la representación de la pantalla de los datos del cliente se corrige con los datos del servidor. Upside es una respuesta más ágil, la desventaja es una ligera pérdida de sincronización.

  3. Una mezcla de las dos, pero en lugar de usar (x, y) las coordenadas utilizamos un vector de [x/y anterior, x/y actual, sugirieron x/y en el intervalo de tiempo ] que luego se puede usar para dibujar trayectorias de proyectiles que cambian constantemente. Parece que esto sería complicado de implementar.

¿Alguna sugerencia?

+0

use socket.io para la comunicación – Alfred

Respuesta

5

La mayoría de los juegos usan alguna forma de cálculo a estima http://en.wikipedia.org/wiki/Dead_reckoning que permite actualizaciones diferidas distribuidas desde el servidor, pero conserva alguna ilusión de actualizaciones en tiempo real en el cliente.

La mejor opción es 3. No es particularmente complejo: simplemente rastrea donde esperas que cada actor se base en la mecánica del juego, y cuando recibas una actualización del servidor, alinearás los dos estados en el tiempo .

Si encuentra que el servidor le envía un estado que está demasiado lejos del estado que su cliente está asumiendo (demasiado lejos necesita ser definido), entonces puede saltar al estado del servidor y aceptar la discontinuidad en el cliente.

+0

Sí, yo haría lo mismo. Dependiendo de su formato de transferencia de datos, la discontinuidad raramente sería notable. Dígame que está usando sockets y no sondeando ... – landons

+0

, incluso si usa socket.io, se basa en encuestas para la mayoría de los usuarios, los websockets solo están habilitados en algunos cajeros automáticos. –

+0

@Ricardo: Al usar Websockets (http://caniuse.com/websockets) y Eventos enviados por el servidor (http://caniuse.com/eventsource), podrá enviar datos a la mayoría de los clientes sin realizar encuestas, solo usuarios de IE. tendrá que usar sondeo. –

Cuestiones relacionadas