首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebSocket frequent onmessage零拷贝

WebSocket frequent onmessage零拷贝
EN

Stack Overflow用户
提问于 2015-11-04 06:41:38
回答 1查看 654关注 0票数 12

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

这并不让我感到惊讶,因为我从onmessage收到了一个对象,至少每16ms接收一次,该对象用于绘图,然后被解除引用。

我的问题是:有什么技巧可以避免/最小化这种情况吗?基于WebSocket API,似乎除了为每个套接字接收调用分配新内存之外,似乎没有其他选择。

作为参考,这里是我的框架视图。

我不知道那个空闲时间是不是垃圾回收?任何开发工具忍者的见解都将非常感谢。

EN

回答 1

Stack Overflow用户

发布于 2015-11-17 23:37:51

我不确定我是否理解了您的问题,但是您可以像在任何其他语言中一样声明一个全局数组,并将其用作循环缓冲区,例如:

代码语言:javascript
复制
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对象的一个简单选项是:

代码语言:javascript
复制
var newJSON = JSON.parse(JSON.stringify(msg));

您可以在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management的JS中找到有关内存分配的更多信息

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33510467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档