【发布时间】:2020-08-06 03:21:03
【问题描述】:
我想问一下使用 WebAssembly/WASM 将一系列图像绘制到画布中是否更快、更节省内存?
我问这个问题是因为我已经测试过在主 UI 和网络工作者中绘制一系列图像(动画)。对于少数画布(1-5 个画布),性能可以忍受,但是对于更多画布(如 20-25),场景会有所不同,渲染变得慢动作。
这是主界面中的代码:
const videoDecoder = new Worker("videoDecoder.js");
const canvas = document.querySelector("#canvas");
const offscreen = canvas.transferControlToOffscreen();
videoDecoder.postMessage({ action: 'init', canvas: offscreen }, [offscreen] );
这是我的网络工作者:
onmessage = async function (e) {
const blob = e.data;
blob.arrayBuffer().then(arrayBuffer => {
const uint8Array = new Uint8Array(arrayBuffer);
for(;;;) {
const offsetIdx = ...;
const endIdx = ...;
const jpegArray = uint8Array.slice(offsetIdx, endIdx);
const blob = new Blob([jpegArray], {type: "image/jpeg"});
drawImage(blob);
}
}
}
async function drawImage(blob) {
const bmp = await createImageBitmap(blob);
context.drawImage(bmp, 0, 0);
bmp.close();
}
这很好,它可以将图像从 web worker 渲染到浏览器,但如前所述,在 1-5 个画布上它仍然很流畅,但是随着更多画布,浏览器中的渲染变得非常慢。
所以我想问使用 WebAssembly 在 Canvas 上绘制一系列图像是否更快?或者与现在使用 web worker 方法相比,理论上不会有性能提升?
【问题讨论】:
-
webassembly 无法访问 DOM - 画布是 DOM 的一部分 - 所以,不,这是不可能的
-
@jaromanda-x 根据stackoverflow.com/questions/42806037/modify-canvas-from-wasm 和我在网上找到的其他博客文章,可以使用共享内存从 WASM “绘制”到画布。
-
好吧,你自己试试看
-
我关心的主要是性能方面,在我尝试为 wasm 将我的网络工作者“重写”为 C++ 之前,我想问一下是否有人体验过与单独使用 Javascript 相比,性能提升多少 - - 或者没有,所以我想提前知道是否有必要承担做 WASM 的任务。
标签: javascript html html5-canvas webassembly emscripten