【发布时间】:2016-08-13 03:23:34
【问题描述】:
我认为我遇到了与以下相关的问题: Systematically updating src of IMG. Memory leak
我没有足够的代表来评论答案,但https://stackoverflow.com/a/34085389/3270244 正是我的情况。
var canvasElement = $('canvas', camContainer);
var ctx = canvasElement[0].getContext('2d');
var image = new Image();
image.onload = function() {
ctx.drawImage(this, 0, 0);
image.src = '';
};
//for every getCamImg I receive exactly 1 image
socket.on('getCamImg', function(err, data) {
if(data) {
var dataImg = data.substring(data.indexOf(';') + 1);
image.src = dataImg;
}
socket.emit('getCamImg');
});
socket.emit('getCamImg');
我每 1/10 秒更改一次 img.src(来自相机的 jpeg),我可以看到浏览器消耗越来越多的内存。 Firefox 停止在 500MB,Edge 停止在 100MB,对于 Chrome,我在 1G 附近停止测试。如果我删除 img.src 更改一切运行顺利(当然没有图像)。
我发现了很多(至少我是这么认为的)相关问题:
- https://bugs.chromium.org/p/chromium/issues/detail?id=36142
- https://bugs.chromium.org/p/chromium/issues/detail?id=337425
- memory leak while drawing many new images to canvas
- Memory leaks when manipulating images in Chrome
某处有人提到(对此感到抱歉:D)缓存可能是垃圾邮件,因为旧图像被保留。我不认为这是 gc 的问题,因为 chrome 有一个工具可以运行他并且没有任何变化。
谁能重现这个或以正确的方式指导我?
更新:
socket.on('getCamImg', function(err, data) {
if(data) {
var image = document.createElement("img");
image.onload = function() {
ctx.drawImage(this, 0, 0, ctx.canvas.width, ctx.canvas.height);
socket.emit('getCamImg');
image.src = '';
};
image.src = dataImg;
}
});
这在 Firefox 中效果很好(image.src='' 很重要)。 Chrome 仍然泄漏。
【问题讨论】:
标签: javascript image caching canvas memory-leaks