【发布时间】:2018-09-02 18:50:49
【问题描述】:
WebGL 很好而且是异步的,因为您可以发送一长串渲染命令而无需等待它们完成。但是,如果出于某种原因确实需要等待渲染完成,则必须与gl.finish() 同步进行。如果gl.finish接受回调并立即返回肯定会更好吗?
问题:有没有办法可靠地模拟这个?
用例:我将大量顶点渲染到一个大的离屏画布,然后使用drawImage 将此大画布的部分复制到页面上的小画布。我实际上并没有使用gl.finish(),但drawImage() 似乎具有相同的效果。在我的应用程序中,仅当用户执行操作(例如单击按钮)时才会触发重新渲染,并且可能需要数百毫秒。如果在渲染过程中浏览器仍然响应允许滚动等,那就太好了。我特别在寻找 Chrome 解决方案,尽管在 Firefox 和 Safari 中也可以使用的东西会很好。
可能的(错误的)答案:您可以尝试估计渲染需要多长时间,然后设置一个从调用gl.finish() 开始的超时。然而,可靠地对所有大小的顶点缓冲区和所有用户进行这种估计是非常棘手和不准确的。
可能的(非)答案:requestAnimationFrame 可以满足我的需求……但它不会,是吗?
2018 年可能的答案:也许ImageBitmap API 解决了这个问题 - 请参阅MDN docs。
【问题讨论】:
-
你无法从同一页面渲染它,使用 'async' gl.finish() 因为没有异步版本。如果在屏幕外绘制图像被认为是“繁重”的东西,那么您可以使用 Web Worker 生成它,然后使用这样的图像返回 postMessage 并将其绘制到画布上。这会稍微节省性能,但绘图仍然必须同步。降低画布的分辨率也可能会加快速度。
-
@MaksimsMihejevs - 从 Web Worker 渲染图像将是异步的,但它将使用 CPU 而不是 GPU,因此速度会慢得多。 (你不能从 WebWorkers 访问 WebGL。)
-
我一直在谈论更多关于画布 2d 上下文的内容,正如您提到的
drawImage。
标签: webgl