2012-10-04 25 views
5

林创建8位无符号的JavaScript数组:的Javascript类型数组“通过线路”

var myArray = Uint8Array(64); 

操纵客户端和服务器上该阵列中,然后将其发送通过socket.io连接。我们正在编写一个游戏,因此通过线路发送的数据尽可能小。因为socket.io不支持发送二进制数据是值得与JavaScript类型数组打扰或应该只使用正常的JavaScript数组?他们仍然会比原生js数组小吗?

+0

这将取决于您使用什么序列化库/ RPC协议通过网络发送数据。 – millimoose

回答

6

注:我将假设客户端是指浏览器。否则,请详细说明。

Socket.io不支持二进制数据,主要是因为它提供了不同的传输,并且其中许多不支持它。

但是,本地websockets DO支持Blob和ArrayBuffers。

如果你真的想用二进制数据来提高效率(我同意,这是你的情况),我认为你应该考虑使用websockets而不是socket.io。

坏:

  • 只有约55%的用户浏览网页与支持WebSockets的浏览器。
  • 你不会有socket.io提供的商品,比如渠道,放出方法。

好:

  • 网络套接字API是非常简单的。

  • 它会更有记忆效率。通常情况下,您的普通数组是通过首先将它们转换为JSON字符串然后将它们发回来进行传输的。这意味着你实际上正在发送数组的字符串表示形式!相反,在这里您将发送您期望的字节量(以更可预测的方式,在发送之前不检查字符串长度,而是以更“协议”的方式 - 如果需要的话)。

如果你决定使用WS,你可以检查此:http://www.adobe.com/devnet/html5/articles/real-time-data-exchange-in-html5-with-websockets.html

否则你可以去用JSON。如果您仍然使用JSON进行socket.io和“通用”支持,也启用闪存传输,并在游戏需要低延迟时禁用较慢的传输。

+0

这就是我想的。尽管你可以让事情变得更清楚。游戏是国际象棋......所以速度并不重要,但我正在写游戏来学习不写游戏。所以我试图尽可能高效。无论如何,我现在的套路太远了。另外,正如你所说的,它增加了更高级别的功能,这是很好的。 – AndrewMcLagan

+0

我在想使用JS类型的数组即使没有二进制套接字也会节省空间,尽管只有少量。我用Uint8Array(64)代表国际象棋棋盘,因为棋盘上有64个方格。只有12种可能的棋子类型,所以我将它们从1 - 12代表并放置在棋盘阵列中。然后在服务器和客户端上有一个pieceMap对象,它将片段代码与片段的名称相关联。例如{1:'BlackKnight',2:'WhiteKnight'} – AndrewMcLagan

+1

与普通数组相比,它不会节省空间。当发送到服务器时,它仍将使用JSON完成,因此将被转换为字符串。 – Mamsaac