【发布时间】:2019-10-26 10:35:41
【问题描述】:
网络工作者可以通过XMLHttpRequest 获取常规图像,对吗?工人如何将这些图像绘制到 OffscreenCanvas 上?大概想用XMLHttp.responseType = 'blob'?
另一种方法是设置图像元素的src,然后将该元素传递给工作人员,但我的工作人员总是拒绝此类图像。
谢谢
【问题讨论】:
标签: javascript canvas web-worker
网络工作者可以通过XMLHttpRequest 获取常规图像,对吗?工人如何将这些图像绘制到 OffscreenCanvas 上?大概想用XMLHttp.responseType = 'blob'?
另一种方法是设置图像元素的src,然后将该元素传递给工作人员,但我的工作人员总是拒绝此类图像。
谢谢
【问题讨论】:
标签: javascript canvas web-worker
ImageBitmap API 就是为了这个目的(等等)。
注意:此演示目前只能在 Chrome 上运行...
const offcanvas = canvas.transferControlToOffscreen();
const worker = new Worker(getWorkerURL());
worker.onmessage = e => console.log(e.data);
worker.postMessage(offcanvas, [offcanvas]);
function getWorkerURL() {
return URL.createObjectURL(
new Blob([
worker_script.textContent
])
);
}
<canvas id="canvas" height="450"></canvas>
<script id="worker_script" type="ws">
onmessage = async (evt) => {
try {
const canvas = evt.data;
const ctx = canvas.getContext('2d');
if(!ctx) {
postMessage('unsupported browser');
return;
}
const imgblob = await fetch('https://upload.wikimedia.org/wikipedia/commons/5/55/John_William_Waterhouse_A_Mermaid.jpg')
.then(r => r.blob());
const img = await createImageBitmap(imgblob);
ctx.drawImage(img, 0,0, canvas.width, canvas.height);
}
catch(e) {
postMessage('unsupported browser');
throw e;
}
};
</script>
【讨论】:
r.blob() 之前错过了return。除此之外,我注意到经过数百次迭代(即使只有一张图像)会消耗大量内存。如果我排除画布,那么内存至少会自动释放。你能建议如何解决画布的内存问题吗?
return。对于您的内存问题,我不确定您的意思...您可以设置minimal reproducible example 吗?但请注意,它占用内存是很正常的(像素必须存储在某个地方),但它应该在 GC 进来后自行释放(如果你有足够的可用内存,这可能永远不会释放)。
drawImage,那么 RAM 将恢复正常。这很可悲,因为使用多个OffscreenCanvas 的工人没有任何好处。即使我将屏幕外传递给工人,ram 保持不变。 (A quick example without workers)