WebGL和Chrome:高分辨率会导致性能下降

时间:2015-02-17 13:00:47

标签: javascript google-chrome libgdx webgl

我有一个用LibGDX创建的应用程序。我可以在桌面上运行该应用程序,它以90 fps @ 1080p运行。

在Firefox上,它以40-50 fps @ 1080p(最大化窗口)运行。

在Chrome上,它以30 fps @ 1080p(最大化窗口)运行。

然而,在Chrome上,如果我降低分辨率,性能会翻倍(达到60fps)。在Firefox上,这不会发生。造成这种情况的原因是什么?

我正在使用webkitRequestAnimationFrame。

如图所示,我知道我的电脑可以很好地处理分辨率。

修改

我尝试应用以下提示,尽管它们似乎主要针对移动GPU。

来源:https://wiki.mozilla.org/Platform/GFX/MobileGPUs#Memory_Bandwidth

在glBindFramebuffer后立即调用glClear

请参阅Adreno 200文档,第3.2.1节:"必须(a)在切换帧缓冲对象(FBO)时使用清除,以避免驱动程序尝试保存/恢复GMEM内容,并且( b)始终清除帧开始处的深度缓冲区。"

这是有道理的,所以我们应该永远这样做。具体来说,这意味着我们应该在每次glBindFramebuffer调用之后执行glClear,理想情况是在它之后,或者至少在任何绘制调用之前。

Framebuffer绑定很昂贵

更改帧缓冲区绑定力会立即解析当前帧缓冲区的渲染。因此,对渲染进行排序以最小化帧缓冲区绑定非常重要。 Adreno 200文档,第3.2.4节,有一个有用的解释。

修改

上述内容没有显着差异。

编辑

我感觉这个问题是由于GLSL编译器引起的。我对这个主题没有太多的了解,但我相信OpenGL ES的GLSL编译成普通的GLSL,并带有一些特定于浏览器的代码。可能是Chrome编译的次数不够理想,导致片段着色会使程序在较高分辨率下降低速度。

如果某人有关于如何确保此编辑最佳化的一些提示,我可以尝试一下,看看它是否解决了问题。

修改

这个问题在使用英特尔高清显卡4000+芯片组的Windows Chrome浏览器中似乎并不普遍。 Chrome版本:40.0.2214.111米。分辨率低:45fps~。高分辨率:30 fps稳定。

我原来的测试案例是在Ubuntu上使用GTX 650的Chrome。Chrome版本将在稍后添加。

修改

显示此问题的Chrome版本:GTX 650显卡上Ubuntu上的40.0.2214.111(64位)。

修改

在配备GTX 650的同一台PC上,在Windows 7下,同一应用程序在Chrome下稳定运行60fps。因为在Ubuntu下,编译为Java的应用程序运行速度可以达到90fps,我相信它不会成为Linux驱动程序的问题,而是Linux版Linux的问题。

修改

我已向Chrome发送了一个关于此问题的错误报告。

1 个答案:

答案 0 :(得分:1)

此处不包括其他内容,就我上次所说的而言,所有requestAnimationFrame方法上限为60fps ,并且只能低于此值。

您可以使用此位进行测试:http://cssdeck.com/labs/gvxnxdrh/。您可以根据需要修改fps var,但在桌面上的任何浏览器中动画都不会超过60fps。