canvas context2d.drawImage( webglCanvas, 0, 0 ) 是否阻塞直到 webgl 完成渲染?
Does canvas context2d.drawImage( webglCanvas, 0, 0 ) block until a webgl is finished rendering?
我假设我的测试答案是“否”,但我想我会确定。
我正在尝试每帧从 WebGL canvas 绘制/复制内容到 2d canvas,我想知道是否应该等到 WebGL 上下文完成绘制(我可以在调用它之前使用 gl.fenceSync 检查),或者我是否可以立即调用 drawImage
而不必担心性能下降。以下是我打算如何使用 three.js 作为渲染器的支架:
const renderer = new THREE.WebGLRendeer();
const canvas = document.createElement( 'canvas' );
const ctx = canvas.getContext( '2d' );
// ...
function renderLoop() {
renderer.render( camera, scene1 );
ctx.drawImage( renderer.domElement, 0, 0 );
renderer.render( camera, scene2 );
ctx.drawImage( renderer.domElement, 0, 0 );
}
这里有我遗漏的陷阱吗?
谢谢!
编辑
根据 gman 的要求,这里有一个示例表明该函数在调用 drawImage
之前似乎不会通过执行大量 GPU 工作(50000 个没有深度写入的实例化立方体)来阻塞。无论是一个立方体还是 50000 个立方体,无论是在 render()
之前还是之后调用,drawImage 函数都需要相同的时间,这让我相信 drawImage
不会阻塞。在装有最新 Chrome:
的 2017 Mac 笔记本电脑上测试
我假设我的测试答案是“否”,但我想我会确定。
我正在尝试每帧从 WebGL canvas 绘制/复制内容到 2d canvas,我想知道是否应该等到 WebGL 上下文完成绘制(我可以在调用它之前使用 gl.fenceSync 检查),或者我是否可以立即调用 drawImage
而不必担心性能下降。以下是我打算如何使用 three.js 作为渲染器的支架:
const renderer = new THREE.WebGLRendeer();
const canvas = document.createElement( 'canvas' );
const ctx = canvas.getContext( '2d' );
// ...
function renderLoop() {
renderer.render( camera, scene1 );
ctx.drawImage( renderer.domElement, 0, 0 );
renderer.render( camera, scene2 );
ctx.drawImage( renderer.domElement, 0, 0 );
}
这里有我遗漏的陷阱吗?
谢谢!
编辑
根据 gman 的要求,这里有一个示例表明该函数在调用 drawImage
之前似乎不会通过执行大量 GPU 工作(50000 个没有深度写入的实例化立方体)来阻塞。无论是一个立方体还是 50000 个立方体,无论是在 render()
之前还是之后调用,drawImage 函数都需要相同的时间,这让我相信 drawImage
不会阻塞。在装有最新 Chrome: