Experimental:这是一个实验中的功能
此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀。由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变。
OffscreenCanvas
提供了一个可以脱离屏幕渲染的 canvas 对象。它在窗口环境和web worker环境均有效。
构造函数
OffscreenCanvas
构造函数。创建一个新的 OffscreenCanvas
对象。
属性
offscreen canvas 对象的高度。
offscreen canvas 对象的宽度。
方法
为 offscreen canvas 对象返回一个渲染画布。
创建一个代表 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()
(en-US) 以前的渲染结果并且通过 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()
(en-US) 会从这个 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);
};
作者:terry,如若转载,请注明出处:https://www.web176.com/canvas/7558.html