在我们的上下文中使用preserveDrawingBuffer时,我们需要自己清理绘图缓冲区。我在我的应用程序中使用了这种技术。
我读了一些文章说 - 将此标志设置为false可以获得更好的性能。
在我的应用程序设置为false时,在某些情况下我需要自己清理前缓冲区,因为当没有绘图时我们仍然可以看到之前绘制的内容。
我的问题是,现在是否值得将我的应用程序颠倒过来并覆盖所有案例以获得更好的表现?它真的改善了吗?
当此标志为真(并且执行gl.clear(..)
)与false比较时,是否有任何演示显示性能不同?
答案 0 :(得分:18)
我知道这已在其他地方得到解答,但我找不到......
preserveDrawingBuffer: false
表示WebGL可以交换缓冲区而不是复制缓冲区。
WebGL画布有2个缓冲区。您正在绘制的那个和正在显示的那个。当绘制网页时,WebGL有2个选项
将绘图缓冲区复制到显示缓冲区。
此操作显然较慢,因为复制数千或数百万像素不是 免费操作
交换两个缓冲区。
此操作实际上是即时的,因为除了交换之外什么都不需要 2个变量的内容。
WebGL交换或复制是否取决于浏览器和其他各种设置,但如果preserveDrawingBuffer
为false
,则WebGL可以交换,如果它true
它可以'吨。
如果您希望看到效果差异,我建议您在手机上试用您的应用。确保抗锯齿也关闭,因为抗锯齿需要 resolve 步骤,这是有效的复制操作。
答案 1 :(得分:0)
据我了解,preserveDrawingBuffer=true
表示WebGL必须刷新帧之间的管道。 OpenGL绘图不是同步的,因此当您完成框架时,绘图命令仍然可以在管道中。
这相当于在渲染循环结束时放置一个flush。 https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/flush
这就是为什么结果可能变化很大的原因。如果您的GPU缓冲了很多命令,那么在执行所有GPU命令时,程序将被强制停止。 但是,如果您的GPU速度很快,那么缓冲区中可能没有太多内容,因此只需继续。
我见过在渲染循环结束时放置一个刷新调用的情况下,Fps降低了50%。
我会避免使用preserveDrawingBuffer=true
因为它会在您最需要的时候损害性能。