如何将低精度数字(2-10位)写入数组缓冲区/ blob?

hyd*_*rix 6 javascript blob arraybuffer

问题:在视频游戏中,有大量的低精度数字可以通过网络打包在一起,与发送字符串相比可以大大节省带宽.字符串分配给UTF-8,每个字符使用1个字节.

理想情况下应该有一种方法将这些数字写在一起:

  • 游戏中的玩家ID - 精度0-1023范围,10位
  • 播放器旋转 - 四元数 - 在一些数学简化之后,一些数字最终为24位
  • 播放器输入 - 0-1范围x2,2 位

如何获取这样的低精度数字并将它们放在数组缓冲区/ blob中?

Aln*_*tak 2

您可以使用Uint32Array, 然后使用移位和掩码操作将值存储在该数组中。

例如,如果您想存储一个 4 位数字,然后存储一个 10 位数字(留下 18 位用于更多字段):

array[0] = (num0 & 0x0f) << 0) |
           (num1 & 0x3ff) << 4);
Run Code Online (Sandbox Code Playgroud)

并提取这些字段:

num0 = (array[0] >>> 0) & 0x0f;
num1 = (array[0] >>> 4) & 0x3ff;
Run Code Online (Sandbox Code Playgroud)

可以ArrayBuffer通过访问其属性来访问该数组以进行序列化.buffer。