2012-10-04 11 views
5

Im la creación de una matriz de JavaScript de 8 bits sin signo:Javascript conjuntos escritos "sobre el alambre"

var myArray = Uint8Array(64); 

La manipulación de esta matriz en cliente y servidor, a continuación, enviarlo a través de una conexión socket.io. Estamos escribiendo un juego, por lo tanto, los datos enviados a través del cable son lo más pequeños posible. como socket.io no admite el envío de datos binarios, ¿vale la pena molestarse con las matrices con javascript o deberíamos usar matrices javascript normales? ¿Serán aún más pequeños que una matriz js nativa?

+0

Esto dependería de qué biblioteca de serialización/protocolo RPC esté utilizando para enviar los datos a través de la red. – millimoose

Respuesta

6

NOTA: supongo que por cliente se refiere al navegador. De lo contrario, aclare con más detalles.

Socket.io no es compatible con datos binarios, principalmente porque ofrece diferentes transportes, y muchos de ellos no son compatibles.

Sin embargo, las websockets nativas SON compatibles con Blobs y ArrayBuffers.

Si realmente quiere ir con datos binarios para la eficiencia (que, estoy de acuerdo, es el camino a seguir en su caso), creo que debería considerar el uso de websockets en lugar de socket.io.

Lo malo:

  • Sólo ~ 55% de los usuarios navegar por la web con un navegador que soporte websockets.
  • No tendría las ofertas de socket.io de productos, tales como canales, emiten y en métodos.

Lo bueno:

  • Web API de sockets es extremadamente simple.

  • Será mucho más eficiente con la memoria. Normalmente, las matrices normales se transfieren haciendo primero una cadena JSON y luego enviándolas. Esto significa que en realidad estás enviando una representación de cadena de tu matriz. En cambio, aquí enviará la cantidad de bytes que esperaría (de una manera más predecible, sin verificar las longitudes de cadena antes de enviar, pero de una manera más "protocolizada" si se desea).

Si decide utilizar WS, se puede comprobar esto: http://www.adobe.com/devnet/html5/articles/real-time-data-exchange-in-html5-with-websockets.html

Cosa que usted puede ir sólo con JSON.

A decir verdad, si sigues con JSON para socket.io y soporte "universal", habilita también el transporte flash y desactiva los transportes más lentos si el juego requiere poca latencia.

+0

Esto es lo que pensé. A pesar de que somos capaces de aclarar las cosas. El juego es ajedrez ... Así que la velocidad no es tan importante, pero estoy escribiendo el juego para aprender a no escribir el juego. Por lo tanto, trato de ser lo más eficiente posible. Estoy muy lejos en el camino de socket.io ahora de todos modos. Además, como notaste, agrega un montón de funcionalidad de nivel superior que es agradable. – AndrewMcLagan

+0

Estoy pensando en utilizar una matriz de tipos JS Incluso SIN tomas binarias ahorrará espacio, aunque solo una pequeña cantidad. Represento el tablero de ajedrez con Uint8Array (64) ya que hay 64 cuadrados en un tablero. Solo hay 12 tipos posibles de piezas, así que las represento del 1 al 12 y las coloco en el conjunto de tablas.Luego, en el servidor y el cliente hay un objeto pieceMap que relaciona el código de pieza con el nombre de esa pieza. p.ej. {1: 'BlackKnight', 2: 'WhiteKnight'} – AndrewMcLagan

+1

No le ahorrará espacio en comparación con una matriz normal. Cuando se envía al servidor, todavía se hará usando JSON y, por lo tanto, se traducirá en una cadena. – Mamsaac

Cuestiones relacionadas