【问题标题】:Javascript typed arrays "over the wire"Javascript 类型化数组“通过网络”
【发布时间】:2012-09-24 23:59:15
【问题描述】:

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

 var myArray = Uint8Array(64);

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

【问题讨论】:

  • 这将取决于您用于通过网络发送数据的序列化库/RPC 协议。

标签: javascript html node.js socket.io


【解决方案1】:

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

Socket.io 不支持二进制数据,主要是因为它提供了不同的传输方式,而且很多都不支持。

但是,原生 websocket 确实支持 Blob 和 ArrayBuffers。

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

坏处:

  • 只有约 55% 的用户使用支持 websocket 的浏览器浏览网页。
  • 您不会拥有 socket.io 提供的商品,例如通道、发射和 on 方法。

好的:

  • Web 套接字 API 非常简单。

  • 内存效率会更高。通常,您的普通数组是通过首先将它们制作为 JSON 字符串然后将它们发送回来传输的。这意味着您实际上是在发送数组的字符串表示形式!相反,您将在此处发送您期望的字节数(以一种更可预测的方式,在发送前不检查字符串长度,但如果需要,以一种更“协议”的方式)。

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

否则,您可以使用 JSON。

说实话,如果您仍然使用 JSON 来支持 socket.io 和“通用”支持,那么也要启用 flash 传输,如果游戏需要低延迟,则禁用较慢的传输。

【讨论】:

  • 这就是我的想法。虽然你我们能够让事情变得更清楚。游戏是国际象棋......所以速度并不重要,但我写游戏是为了学会不写游戏。所以我尽量提高效率。无论如何,我现在在 socket.io 的道路上太远了。另外,正如您所指出的,它添加了许多很好的更高级别的功能。
  • 我正在考虑使用 JS 类型的数组即使没有二进制套接字也会节省空间,尽管只是少量。我用 Uint8Array(64) 代表棋盘,因为棋盘上有 64 个方格。只有 12 种可能的棋子类型,所以我从 1 到 12 表示它们并将它们放在棋盘数组中。然后在服务器和客户端上有一个pieceMap 对象,它将片段代码与该片段的名称相关联。例如{ 1:“黑骑士”,2:“白骑士”}
  • 与普通数组相比,它不会为您节省空间。当发送到服务器时,它仍然会使用 JSON 完成,因此将被翻译成字符串。
  • 是的,你的权利,但它会比直接使用棋子的名称更小:['BlackKnight','whiteKnight'] 因为这将使用更少的字符。虽然类型化数组或普通 json 是一样的..
  • 这个答案非常过时,可能应该进行编辑。据 caniuse 称,97.39% 的客户支持 websocket。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多