11

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

这并不让我感到意外,因为我从onmessage收到一个对象,至少每16ms一次,用于绘制然后解除引用。

我的问题是:有避免/最小化的提示吗?根据WebSocket API,在每个套接字接收呼叫上分配新内存似乎没有替代方案。在另一种语言/环境中,我会预先分配一些内存并接收到缓冲区中,以避免为短期对象不断分配内存,但我想不出在浏览器中使用JavaScript实现这一点的明显方法。

仅供参考,这里是我的框架视图。

enter image description here

我不知道这是否空闲时间是垃圾收集?任何开发工具忍者的见解将不胜感激。如果

+0

你有任何的代码示例分配内存的更多信息?开始了什么?一把小提琴? – Anonymous0day

+1

我在WebSockets上从我的树莓派流式传感器日期有同样的问题。恐怕有,并且将无法干扰JavaScript中的WebSockets的内存分配。我的研究没有带来任何结果。 – windm

+0

你希望实现什么?程序运行多长时间,一致的长期性能有多重要?看到一些代码或代码示例会很棒 –

回答

1

不知道我理解你的问题,但你可以在任何其他语言声明全局阵列状,并用它作为循环缓冲器,例如:

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定义回调设置了一个param。

注意JS GC只会在代码中不再引用它时才销毁该内存块。

上面我做的是将该引用保存在缓冲区中,以便在回调完成后该值不会被破坏,您可以稍后使用getNext访问它。你不需要分配新的内存,因为JS为你做了。

如果您想克隆或创建msg的不同副本,则有一些不同的选项。一个简单的选择,让你克隆非圆形的JSON对象是:

var newJSON = JSON.parse(JSON.stringify(msg)); 

您可以找到有关JS在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management

+0

这并不能回答我的问题,具体是关于“在每个套接字上分配的新内存接收呼叫”。 – sethro

+0

我特别关心分配给传递给'onmessage'对象的内存:'msg'。我认为你误解了我的问题。我正在寻求一种方法来预先分配一个缓冲区,WebSocket或者其他一些API将用来从底层套接字接收的缓冲区。 – sethro

+1

好的,我现在明白你的问题了。我不认为你可以使用JS做任何事情。您可能能够减轻Chrome chrome中的零拷贝光栅化程序的一些总延迟:// flags /#enable-zero-copy,以便在webgl中呈现更快的速度。另外,考虑到你的问题是关于内存访问的问题,你可以使用从服务器发送的数据包的数量/大小,更少/更大的数据包将减少操作的数量。 –