我有一个应用程序,它通过WebSocket频繁地接收二进制消息(至少每帧一次),并使用canvas/webgl绘制数据。我已经注意到我有一个非常好的锯齿形内存配置文件;大量短暂的数据块。

这并不让我感到惊讶,因为我从onmessage收到了一个对象,至少每16ms接收一次,该对象用于绘图,然后被解除引用。
我的问题是:有什么技巧可以避免/最小化这种情况吗?基于WebSocket API,似乎除了为每个套接字接收调用分配新内存之外,似乎没有其他选择。
作为参考,这里是我的框架视图。

我不知道那个空闲时间是不是垃圾回收?任何开发工具忍者的见解都将非常感谢。
发布于 2015-11-17 23:37:51
我不确定我是否理解了您的问题,但是您可以像在任何其他语言中一样声明一个全局数组,并将其用作循环缓冲区,例如:
var buffer = [];
var bufferLength = 1000;
var start = 0;
var end = 0;
var content = 0;
socket.onmessage(function(msg) { //msg allocated
end %= bufferLength;
if (end == start && content != 0)
console.log("Buffer is full");
else {
content++;
buffer[end++] = msg; //reference to msg saved so it's not destroyed at the end of the callback
}
});
function getNext() {
start %= bufferLength;
if (start == end && content == 0)
console.log("Buffer is empty");
else {
content--;
return buffer[start++]; // returns reference to next msg
}
}编辑:我修改了答案,以便更清楚地了解内存周期:
JS将在websockets上为接收到的消息分配内存,并创建一个名为msg的引用,该引用将在为onmessage定义的回调中作为参数提供给您。
注JS只会在代码中不再引用该内存块时销毁它。
我上面所做的是将该引用保存在一个缓冲区中,这样当回调完成时,该值就不会被销毁,您可以稍后使用getNext访问它。您不需要分配新内存,因为JS会为您分配新内存。
如果您想克隆或创建一个不同的msg副本,有一些不同的选项。允许您克隆非循环JSON对象的一个简单选项是:
var newJSON = JSON.parse(JSON.stringify(msg));您可以在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management的JS中找到有关内存分配的更多信息
https://stackoverflow.com/questions/33510467
复制相似问题