WebGL和Chrome:高分辨率会导致糟糕的性能



我用LibGDX创建了一个应用程序。我可以在桌面上运行该应用程序,它以90帧/秒@1080p的速度运行。

在Firefox上,它的运行速度为40-50帧/秒@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调用之后,最好是在调用之后,或者至少在任何draw调用之前,执行glClear。

帧缓冲区绑定非常昂贵

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

编辑

上述情况并没有产生显著差异。

编辑

我有一种感觉,这个问题是由于GLSL编译器引起的。我对这个主题没有太多的知识,但我相信OpenGL ES的GLSL是用一些特定于浏览器的代码编译成常规GLSL的。可能是Chrome的编译不太理想,导致碎片着色在更高的分辨率下减慢了程序的速度。

如果有人对如何确保这个编译得到优化有一些建议,我可以尝试一下,看看它是否能解决问题。

编辑

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

我最初的测试用例是使用GTX650的Ubuntu上的Chrome。Chrome版本将稍后添加。

编辑

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

编辑

在装有GTX650的同一台电脑上,在Windows7下,同一应用程序在Chrome下以60fps的稳定速度运行。由于在Ubuntu下,编译成Java的应用程序以90fps的速度运行良好,我相信这不可能是Linux驱动程序的问题,而是Linux版本Chrome的问题。

编辑

我已经就此向Chrome发送了一份错误报告。

这里不包括其他内容,就我上次所了解的情况而言,所有requestAnimationFrame方法的上限都是60fps,并且只能低于这个值。

您可以使用此位进行测试:http://cssdeck.com/labs/gvxnxdrh/.你可以随心所欲地修改fps var,但在我桌面上的任何浏览器中,动画的速度都不会超过60fps。

最新更新