提问人:Kajuna 提问时间:3/14/2023 最后编辑:midnight-codingKajuna 更新时间:6/2/2023 访问量:212
使用可转移对象时 Web Worker 内存泄漏
Web worker memory leak when using transferables
问:
我将画布图像作为位图发送给 Web 工作人员,后者将其转换为 blob 并将其发送回去。在 postMessage 可转移对象中包含 ImageBitmap 和返回的 ArrayBuffer 似乎是获得更好性能的最佳做法,但由于 Chromium 版本 M93 或 M92 这样做会导致巨大的内存泄漏。我反复这样做,但要等到工人完成。直到 ElectronJS 13 (Chrome 91) 都很好。
简而言之,主进程将画布转换为位图并将其发送给工作线程:
createImageBitmap(canvas).then(bitmap => {
worker.postMessage(bitmap, [bitmap]);
});
辅助角色创建 blob 并将其发回:
worker.onmessage = function ({ data }) {
ctx.transferFromImageBitmap(data);
canvas.convertToBlob().then(blob => {
blob.arrayBuffer().then(arrBuf => {
worker.postMessage(arrBuf, [arrBuf]);
});
});
};
这是简化的。在这个小提琴中可以找到一个更完整的例子:https://jsfiddle.net/1eqkfngc/(在小提琴中,内存最终会下降,而在 Electron 上则不会)
删除可转移对象数组可以解决内存问题,但理论上的性能较差。
我应该做一些不同的事情,还是这是 Chrome 中的错误?我已经提交了错误报告。
答:
0赞
Kajuna
6/2/2023
#1
此问题已在 Chrome 版本 115.0.5780.0 和 Electron 版本 26 左右修复
评论