OffscreenCanvas
Baseline Widely available *
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2023年3月.
* Some parts of this feature may have varying levels of support.
OffscreenCanvas 提供了一个可以脱离屏幕渲染的 canvas 对象。它在窗口环境和web worker环境均有效。
构造函数
OffscreenCanvas()-
OffscreenCanvas构造函数。创建一个新的OffscreenCanvas对象。
属性
OffscreenCanvas.height-
offscreen canvas 对象的高度。
OffscreenCanvas.width-
offscreen canvas 对象的宽度。
方法
OffscreenCanvas.getContext()-
为 offscreen canvas 对象返回一个渲染画布。
OffscreenCanvas.convertToBlob()-
创建一个代表 canvas 中的图像的
Blob对象。 OffscreenCanvas.transferToImageBitmap()-
从
OffscreenCanvas最近渲染的图像创建一个ImageBitmap对象。
例子
>同步显示 OffscreenCanvas 中的帧
一种方式是使用OffscreenCanvas API,也就是用已经包含OffscreenCanvas对象的RenderingContext 来生成新的帧。每次一个新的帧在画布中完成渲染,transferToImageBitmap() 方法都会被调用来保存最近渲染的图像。该方法返回一个ImageBitmap对象,该对象可以被用在各种 Web APIs 中,也可以用在下一个 canvas 中,并且不需要转换备份。
为了显示ImageBitmap,你可以用ImageBitmapRenderingContext上下文,通过一个 canvas(可见的)元素调用canvas.getContext("bitmaprenderer")方法来创建它。该上下文只提供用ImageBitmap替换 canvas 的内容的功能。调用ImageBitmapRenderingContext.transferFromImageBitmap() 以前的渲染结果并且通过 OffscreenCanvas 保存ImageBitmap,会在 canvas 里显示ImageBitmap并且转换其所有权到 canvas。一个单独的 OffscreenCanvas 可以将帧转换到任意数量的其他ImageBitmapRenderingContext对象。
提供两个 <canvas> 元素
<canvas id="one"></canvas> <canvas id="two"></canvas> 下面的代码会用 OffscreenCanvas 提供渲染结果,就像上面描述的一样。
var one = document.getElementById("one").getContext("bitmaprenderer"); var two = document.getElementById("two").getContext("bitmaprenderer"); var offscreen = new OffscreenCanvas(256, 256); var gl = offscreen.getContext("webgl"); // ... some drawing for the first canvas using the gl context ... // Commit rendering to the first canvas var bitmapOne = offscreen.transferToImageBitmap(); one.transferFromImageBitmap(bitmapOne); // ... some more drawing for the second canvas using the gl context ... // Commit rendering to the second canvas var bitmapTwo = offscreen.transferToImageBitmap(); two.transferFromImageBitmap(bitmapTwo); 异步显示 OffscreenCanvas 生成的帧
另一种使用 OffscreenCanvas API 的方式,是在一个<canvas>元素上调用transferControlToOffscreen(),也可以在worker或主线程,上调用,这将从主线程的HTMLCanvasElement对象返回一个OffscreenCanvas 对象。调用getContext() 会从这个 OffscreenCanvas 获取一个RenderingContext。
main.js (主线程代码):
var htmlCanvas = document.getElementById("canvas"); var offscreen = htmlCanvas.transferControlToOffscreen(); var worker = new Worker("offscreencanvas.js"); worker.postMessage({ canvas: offscreen }, [offscreen]); offscreencanvas.js (web work 代码):
onmessage = function (evt) { var canvas = evt.data.canvas; var gl = canvas.getContext("webgl"); // ... some drawing using the gl context ... // Push frames back to the original HTMLCanvasElement gl.commit(); }; 也可以在 worker 中使用 requestAnimationFrame
onmessage = function (evt) { const canvas = evt.data.canvas; const gl = canvas.getContext("webgl"); function render(time) { // ... some drawing using the gl context ... requestAnimationFrame(render); } requestAnimationFrame(render); }; 规范
| Specification |
|---|
| HTML> # the-offscreencanvas-interface> |