2011-01-15 18 views
6

Escribo un juego en javascript, y para evitar hacer trampas, hago que el juego se juegue en el servidor (es un juego de mesa como las damas más complicadas). Dado que el juego es bastante complejo, necesito almacenar el estado del juego para validar las acciones del cliente.node.js almacenando gamestate, ¿cómo?

¿Es posible almacenar el estado del juego en la memoria? ¿Eso es inteligente? ¿Debo hacer eso? ¿Si es así, cómo? No sé cómo funcionaría eso.

También puedo almacenar en redis. Y ese tipo de cosas es bastante familiar para mí y no requiere explicación. Pero si almaceno en redis, el problema es que en cada movimiento, el juego necesitaría obtener los datos de redis e interpretar y analizar esos datos para recrear el estado del juego desde cero. Pero como las mudanzas ocurren con mucha frecuencia, esto me parece muy estúpido.

¿Qué debo hacer?

+1

Esto realmente no tiene nada que ver con JavaScript. Básicamente, solo necesitas un servidor que pueda tratar con todos los clientes conectados diferentes, y dado que un programa se ejecuta en la memoria, ¡será rápido! Solo guarde el estado del juego en una base de datos si necesita "guardar" el juego. Representa el estado de tu juego en el código! –

+0

@Marcus gracias, estoy pidiendo consejos sobre la implementación, ya que no es tan obvio para mí. ¿Cómo represento el estado del juego en el código? – expressnoob

+0

@expressnoob variables y clases. Estas son las herramientas, úsalas para representar objetos en tu juego, como "Juego", "Jugador", "Pieza", etc. El diseño depende de ti y es específico de tu juego. –

Respuesta

4

Si realmente, realmente no quieren la sobrecarga de E/S a continuación, sólo almacenar el estado del juego en un objeto global introducido por el juego Identificación:

var global_gamesate = {} 

Luego, en cada conexión comprueban lo que el juego id es que para recuperar el estado del juego:

var gamestate = global_gamestate[game_id]; 

es de suponer que ya tienen un mecanismo para asignar a las sesiones de cliente juego ID.

Por lo general, el estado del juego es pequeño y apenas ocupará mucha RAM. Seamos pesimistas y supongamos que cada estado del juego ocupa 500K. Luego puede servir dos millones mil juegos (cuatro millones miles de usuarios si asumimos dos usuarios por juego) por cada gigabyte de RAM en su servidor.


Sin embargo, me gustaría señalar que las bases de datos como MySQL ya implementar el almacenamiento en caché (que es configurable), de manera de cargar los datos de uso más frecuente, básicamente, las cargas de la memoria RAM con un zócalo menor/overhead I O. Las ventajas de las bases de datos es que puede tener mucha más información que la RAM porque almacenan el resto en el disco.

Si su programa alcanza la carga en la que comienza a pensar en escribir su propio algoritmo de serialización de disco para implementar un archivo de intercambio, básicamente está reinventando la rueda. En ese caso, diría que ir con bases de datos.

+0

¿Qué pasa con la concurrencia? Si dos clientes desean cambiar el mismo estado de juego global al mismo tiempo, ¿no interferirán entre sí y arruinarán el estado? – Jeena

+0

Javascript no tiene subprocesos y, por lo tanto, no es compatible con la concurrencia "real". Todos los códigos son atómicos y el límite del proceso ingresa al bucle de evento (después de la última línea de un script, entrada a setTimeout/setInterval, callbacks ajax, etc.). Los intérpretes de JavaScript más recientes admiten subprocesos de trabajo pero en ese modelo todos los subprocesos solo pueden interactuar mediante el bucle de evento, por lo que no hay problemas de concurrencia ya que los subprocesos no pueden compartir variables globales (cada subproceso tiene su propio alcance global) – slebetman

+0

¿cuál sería la mejor manera de ahorrar? el estado del servidor (el progreso de todos los juegos y sus usuarios) al recargar, por ejemplo? – Herokiller