我在Javascript游戏中使用typed arrays在客户端(在浏览器中运行)和服务器(运行node.js)之间发送数据。我可以来回发送消息没问题,但我有兴趣重复使用我输入的数组,而不是每次发送消息时都创建一个新数组。
这是我的sendMessage代码:
function sendMessage(socket, data) {
// data is JSON
var encoded = BISON.encode(data);
if (socket.isBinary) {
var len = encoded.length,
bytes = new Uint32Array(len);
for (var i = 0; i < len; ++i) {
bytes[i] = encoded.charCodeAt(i);
}
}
if (server && socket.isBinary) {
socket.send(bytes, { binary: true, mask: false });
} else {
socket.send(encoded);
}
}
这是我的readMessage代码:
function readMessage(data) {
if (data instanceof ArrayBuffer) {
var bytes = new Uint32Array(data);
data = String.fromCharCode.apply(null, bytes);
}
var message = JSON.stringify(BISON.decode(data));
return JSON.parse(message);
}
每次发送消息时,我都会创建一个新的Uint32Array,将其初始化为我打算发送的消息的长度。而不是每次我都想为每条消息重用这个数组时创建一个新数组。
我目前的想法是确定我的maxMessageSize
并用这个长度初始化数组。 maxMessageSize
将是允许通过套接字发送的最大允许消息。
大多数邮件的大小不一定完全 maxMessageSize
。在这些情况下,我是否需要使用某个值(null
?)来填充消息的长度。当读取套接字另一端的值时,我怎么知道这个填充何时开始?
在撰写所有这些内容时,我发现了另一个问题:这是否值得付出努力?
答案 0 :(得分:1)
据我所知,一旦Uint*Array被构造,就无法改变它的长度,你只能从中获得子数组。
任何填充都必须使用32位整数,如果您尝试使用null
,ToInt(null)
为0
,那么您将拥有0
那个条目。如果你想这样填充,你需要传递一些长度值(数组中的第一个或最后一个条目),你需要在接收端查看,以了解何时修剪数据,这意味着{ {1}}少了一点。
使用子阵列可能是你想要的,构造你的最大长度数组,填充它,然后使用maxMessageSize
来获得你想要的实际数组。我不确定这是否比每次构建新的都有任何优势。