【问题标题】:What is the difference between an array and an ArrayBuffer?数组和 ArrayBuffer 有什么区别?
【发布时间】:2016-08-10 19:25:13
【问题描述】:

我只是想知道为什么每个人都使用ArrayBuffer 而不是普通的arraystring 或字符串化的JSON 来将消息从服​​务器发送到客户端。效率更高吗?

另外,只是想知道Uint8Array 是什么,它有什么不同,两者在哪里使用等等。

我目前正在使用带有 Socket.io 的 Node.js,但如果它是更好的方法,我很乐意更改为纯 WebSockets。

【问题讨论】:

标签: javascript node.js websocket socket.io arraybuffer


【解决方案1】:

ArrayBuffer 不仅仅是一个简单的数组。它包含原始二进制数据。这对于直接内存操作和节省空间非常有用。

当您创建一个普通数组时,在许多情况下您不会获得一组合适的连续内存,因为数组可以包含不同类型对象的任意组合。当您同时拥有动态数据和多种类型(在 JS 中经常发生)时,这很有用,但当您知道所需的 确切 内存布局时,它就不是那么有用了。

这还允许您查看字节级别的数据。例如,在二进制数据格式中很常见的是有一个 n 字节长的标识符号,一个 m 字节长的字段告诉您该字段使用了多少字节,以及m' 个字节的数据,实际构成数据字段。

[ identifier ][ bytes of data ][ data ]

使用 ArrayBuffer,您可以选择使用各种视图在字节级别上移动该数据。常规数组不允许您以该粒度级别在数据中移动,因为无法保证内存布局。

最后,因为您要告诉编译器/解释器确切要使用多少空间以及确切要如何查看它,所以它可以在处理该数据时进行更高级的优化。在遍历该数据时,它不必在内存中进行计算跳跃。相反,它确切地知道要在内存中前进多远才能找到下一个数据点。

至于Uint8Array 是什么,它是一个类型化数组。从本质上讲,它告诉编译器/解释器您将以 8 位 uints 的形式访问此数据,这再次允许它进行更好的优化。然后,您可以在其上使用标准数组索引 (arr[0], arr[1], etc.),您将从数组中取回等效的 uint 值。

TL;DR当确切的数据格式已知时,它们占用的空间更少,允许您更准确地移动数据并为编译器/解释器提供更多优化选项。

【讨论】:

  • 很好的答案!例如,在 MMO 中,我如何使用 Buffer/ArrayBuffer 向玩家发送更新?
  • @Mirabilis 这一切都取决于你如何发送它。 Here's the socket.io 关于如何发送二进制数据的文档。 Here's one question 展示如何通过 WebSockets 处理它。
  • 好的,假设我有一组玩家想从我的服务器发送给我的客户:[{id:1,x:5,y:10},{id:2,x:15,y:20},{id:3,x:25,y:30}]。但是客户端不知道数组的长度,所以我可以有这样的东西:[length(3),id,x,y,id,x,y,id,x,y] 所以`[3,1,5,10,2,15,20,3,25,30]?帮助! ;)
  • They take less space when the exact data format is known -> “他们”指的是数组,对吧?
  • @akki “他们”指的是ArrayBuffer 和任何TypedArray
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 2011-01-21
  • 2012-03-14
  • 2013-09-21
  • 2015-08-27
  • 2012-12-09
相关资源
最近更新 更多