JavaScript类型化数组“通过网络传输”

5

我正在创建一个8位无符号JavaScript数组:

 var myArray = Uint8Array(64);

在客户端和服务器上操作此数组,然后通过 socket.io 连接发送它。由于我们正在编写游戏,因此尽可能使发送到网络的数据小。由于 socket.io 不支持发送二进制数据,所以是否值得使用 JavaScript 类型化数组,还是应该只使用普通的 JavaScript 数组?它们是否仍然比原生 JS 数组更小?


这将取决于您使用的序列化库/ RPC协议来通过网络发送数据。 - millimoose
1个回答

6
注意:我将假设您所说的客户端是浏览器。否则,请提供更多详细信息。
Socket.io不支持二进制数据,主要是因为它提供了不同的传输方式,其中很多不支持它。
然而,原生的WebSockets支持Blobs和ArrayBuffers。
如果您真的想要使用二进制数据以提高效率(我同意,在您的情况下这是正确的方法),我认为您应该考虑使用WebSockets而不是Socket.io。
缺点:
- 仅约55%的用户使用支持WebSockets的浏览器浏览网络。 - 您将无法使用Socket.io提供的通道、发射和接收方法等便利工具。
优点:
- WebSockets API非常简单。 - 它将更加内存高效。通常,您的普通数组是通过首先将它们转换为JSON字符串,然后发送它们回来来传输的。这意味着您实际上正在发送数组的字符串表示形式!相反,在这里,您将发送您预期的字节数(以更可预测的方式,无需在发送之前检查字符串长度,但如果需要可以以更“协议”方式发送)。
如果您决定使用WS,则可以检查此内容:http://www.adobe.com/devnet/html5/articles/real-time-data-exchange-in-html5-with-websockets.html 否则,您可以选择使用JSON。
事实上,如果您仍然选择在Socket.io中使用JSON并希望“通用”支持,请启用Flash传输,并禁用需要低延迟的较慢的传输。

这就是我的想法。虽然你能让事情更清晰,但游戏是国际象棋...所以速度不是非常重要,但我写这个游戏是为了学习而不是为了写游戏。因此,我尽可能地高效。不管怎样,我已经走得太远了。另外,正如你所指出的,它添加了很多很好的高级功能。 - AndrewMcLagan
我在考虑使用JS类型数组,即使没有二进制套接字也可以节省空间,尽管只有很少的量。我用Uint8Array(64)表示棋盘,因为棋盘上有64个方格。只有12种可能的棋子类型,所以我用1-12来表示它们,并将它们放置在棋盘数组中。然后在服务器和客户端上,有一个pieceMap对象将棋子代码与该棋子的名称相关联。例如:{1:'BlackKnight',2:'WhiteKnight'}。 - AndrewMcLagan
1
与普通数组相比,它不会节省空间。当发送到服务器时,仍将使用JSON并转换为字符串。 - Mamsaac
是的,你是对的,但使用 ['BlackKnight','whiteKnight'] 的名称会比直接使用棋子名称更短,因为这样可以使用更少的字符。尽管类型化数组或普通 JSON 是相同的。 - AndrewMcLagan
这个答案已经非常过时了,可能需要进行编辑。根据 caniuse 的数据,97.39% 的客户端支持 WebSockets。 - lukad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接