2015-01-02 35 views
4

当我们的上下文使用preserveDrawingBuffer时,我们需要照顾我们自己清理绘图缓冲区。我在我的应用程序中使用这种技术。preserveDrawingBuffer false - 是否值得付出努力?

我看了一篇文章说 - 设置这个标志为false可以获得更好的性能。

在我的应用程序设置为false时,在某些情况下,我需要照顾清除前台缓冲区,因为当没有绘图发生时,我们仍然可以看到之前绘制的内容。

我的问题是,现在是否值得将我的应用程序颠倒并覆盖所有情况以获得更好的性能?它真的好多了吗?

当这个标志为真(并且执行gl.clear(..))与虚假比较时,是否有演示显示不同的演奏?

+0

在良好的视频卡中,清除是按区域逐个区域地完成的(expl 64X64'区块')。所以一个好的webgl实现只会清除这些标志,而不会在内存中写入一堆零。我敢打赌,当preserveDrawingBuffer为true或false时,性能增益非常小(rq:我从未在我的配置文件中看到clear())。希望你能有一个更完整的答案。 – GameAlchemist

回答

9

我知道这已经回答了其他地方,但我不能找到这么....

preserveDrawingBuffer: false 

指的WebGL可以交换缓冲器,而不是复制的缓冲区。

WebGL画布有2个缓冲区。您正在绘制的那个和正在显示的那个。当绘制网页时,WebGL有2个选项

  1. 将绘图缓冲区复制到显示缓冲区。

    这种操作是很明显慢作为复制数千或数百万像素不 自由操作

  2. 交换两个缓冲器。

    该操作实际上是即时的,因为除了交换 两个变量的内容之外,没有什么需要发生。

无论WebGL的互换或复印件要由浏览器和其他各种设置,但如果preserveDrawingBufferfalse的WebGL可以换,如果是true它不能。

如果您希望看到perf差异,我建议在手机上试用您的应用。确保抗锯齿功能已关闭,因为抗锯齿功能需要解决这是有效复制操作的步骤。

+0

我的应用程序没有运行在手机上(至少现在),但我的客户图形卡很便宜,所以我决定去找它,并检查我的应用程序的所有错误'preserveDrawingBuffer = false'会导致并可能得到那里有更好的表演。谢谢分配 –

+2

工作完成并覆盖了所有情况后,我设法通过'preserveDrawingBuffer = false'发布了一些版本。个人而言,我没有看到任何性能变化,但是,在我的客户使用他们糟糕的显卡时,他们说有很棒的性能提升。只想分享 –

0

据我所知,preserveDrawingBuffer=true意味着WebGL必须刷新帧之间的管道。 OpenGL图形不是同步的,因此当你完成你的框架时,绘图命令仍然处于流水线中。

这相当于在渲染循环结束时放置一个flush。 https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/flush

所以这就是为什么结果可能会有很大差异。如果你的GPU已经缓存了很多命令,那么当所有的GPU命令执行时,程序将被强制停止。但是,如果你的GPU速度很快,那么缓冲区中可能没有太多东西,所以事情简单地继续下去。

我见过在渲染循环结束处放置flush调用的情况,将FPS降低了50%。

我会避免preserveDrawingBuffer=true,因为当你最需要它时会损害性能。

+0

'preserveDrawingBuffer:true'与'gl.flush'没有任何关系。它只与交换缓冲区和复制缓冲区有关系。在苹果公司的要求下,它专门增加了该规范,声称在iOS上交换缓冲区的速度会更快。 'gl.flush'应该不会影响帧速率。这可能会产生影响。 'gl.flush'只是意味着“知道我迄今为止发布的所有命令”,其中'gl.finish'意思是“执行我迄今发布的所有命令,并且在它们完成之前不会返回” – gman