我希望能够在一个运行在Web Worker上的asm.js代码中生成图像。并且我希望定期将该计算的最新状态与其他内容一起合成到用户可见的2D画布上。目前,我已经有了这样的代码。
- 使用其构造函数,基于asm.js代码使用的数组缓冲区的一部分,构建
ImageData
对象。 - 调用
createImageBitmap
将ImageData
转换为ImageBitmap
。 - 传输该图像位图从工作线程到GUI线程,并
- 将该
ImageBitmap
用作CanvasRenderingContext2D.drawImage
的参数。
如果您想查看我的当前方法的代码,请看我的工作者的相关部分:
var buffer = new ArrayBuffer(bufferSize);
var asm = Module.asm(self, {}, buffer);
var imgBytes = new Uint8ClampedArray(buffer, offset);
var imgData = new ImageData(imgBytes, width, height);
createImageBitmap(imgData).then(function(bmp) { // Not available on Safari!
postMessage(bmp, [bmp]);
});
这里是相应的GUI线程代码:
var worker = new Worker(‹url of worker›);
worker.onmessage = function(msg) {
var img = msg.data;
context2d.drawImage(img, 0, 0, width, height);
};
实际的完整代码在this GitHub pull request中,但是还有很多其他与问题无关的内容。
postMessage
中传输imgData
的buffer
到主线程,使用.putImageData
替代.drawImage
;请参见更新的帖子。 - guest271314drawImage
,但是我可以将putImageData
放到离屏画布中,然后将其绘制到主画布上。 - MvG