Javascript WebGL和Chrome:高分辨率导致性能不佳

Javascript WebGL和Chrome:高分辨率导致性能不佳,javascript,google-chrome,libgdx,webgl,Javascript,Google Chrome,Libgdx,Webgl,我用LibGDX创建了一个应用程序。我可以在桌面上运行应用程序,它以90 fps@1080p的速度运行 在Firefox上,它在1080p(最大化窗口)下以40-50 fps的速度运行 在Chrome上,它在1080p(最大化窗口)下以30 fps的速度运行 但是在Chrome上,如果我降低分辨率,性能会加倍(达到60fps)。在Firefox上,这不会发生。这可能是什么原因 我正在使用webkitRequestAnimationFrame 如图所示,我知道我的电脑可以很好地处理分辨率 编辑 我

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

在Firefox上,它在1080p(最大化窗口)下以40-50 fps的速度运行

在Chrome上,它在1080p(最大化窗口)下以30 fps的速度运行

但是在Chrome上,如果我降低分辨率,性能会加倍(达到60fps)。在Firefox上,这不会发生。这可能是什么原因

我正在使用webkitRequestAnimationFrame

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

编辑

我正在尝试应用下面的技巧,尽管它们似乎主要针对移动GPU

资料来源:

始终在glBindFramebuffer之后立即调用glClear

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

这是有道理的,所以我们应该一直这样做。具体地说,这意味着我们应该在每次glBindFramebuffer调用之后执行glClear,最好是在它之后,或者至少在任何draw调用之前

帧缓冲区绑定非常昂贵

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

编辑

上述情况并没有造成显著差异

编辑

我感觉这个问题是由GLSL编译器引起的。我对这方面的知识不多,但我相信OpenGLES的GLSL是通过一些特定于浏览器的代码编译成常规GLSL的。这可能是因为Chrome编译不够理想,并导致片段着色在较高分辨率下减慢程序的速度

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

编辑

这一问题在采用英特尔HD graphics 4000+芯片组的Windows Chrome上似乎并不普遍。Chrome版本:40.0.2214.111 m。低分辨率:45fps~。高分辨率:30 fps稳定

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

编辑

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

编辑

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

编辑


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

这里不包括其他内容,就我上次所了解的情况而言,所有那些
requestAnimationFrame
方法都限制在60帧,并且只能低于60帧


您可以使用以下位对其进行测试:。您可以将
fps
var修改到您希望的最高值,但在我桌面上的任何浏览器中,动画的速度都不会超过60fps。

您是否尝试过比较chrome://gpu/ 从Linux和Windows查看是否检测到不同的问题?另外,检查Chrome/Ubuntu是否支持硬件加速。此外,检查Chrome/Ubuntu上的问题是否真的是渲染。。也许这是代码的另一部分。我想建议,也许向发送电子邮件是个好主意。您是在渲染循环中调用
gl.getError()
还是
gl.readPixels
?这两种方法都会扼杀性能。您是否正在上载大量数据(如视频)?通常,您会发现WebGL比本机慢,因为WebGL画布被合成到网页中。对于全屏画布,这是一个额外的全屏绘制。除此之外,requestAnimationFrame限制为60fps(或监视器的刷新率)。如果要检查时间,应检查每帧使用或保留的毫秒数,而不是每秒多少帧,因为在windows WebGL上,监视器无法显示这些帧。WebGL使用DirectX和通过传输的HLSL着色器。尝试使用
——use gl=desktop
标志运行Chrome(之前没有运行任何Chrome实例),看看您是否遇到同样的性能问题。此外,如果您不提供有关应用程序在呈现方面所做工作的任何详细信息,则无法解决此问题。考虑将链接添加到BugRePig中,因为它可能会帮助其他人。@ GME,除非调试,否则我不使用GETError。我也没有使用glReadPixels,也没有上传太多。我已经做了很大的修改,很久没有遇到这个问题了。我曾经注意到,输出太多的日志信息(我不确定Libgdx使用了什么,大概是console.log)会导致速度变慢。我以前可能也这么做过。我和VSync没有任何关系。由于某些原因,Chrome不喜欢用高分辨率更新windows。如果我有一个最大化的窗口,它是20fps。以一半的分辨率最大化窗口,仍为20 fps。但是,如果我将窗口缩小到一半,它会极大地增加fps。Firefox没有显示此问题。无法真正重现此行为。。。Wat分辨率/窗口大小在chrome中开始中断?当您受到GPU限制时,帧率随窗口大小(分辨率)而变化。它发生在一个浏览器中,而不是在另一个浏览器中,很可能是因为OpenGL实现。至于requestAnimationFrame的频率。。。这取决于CPU和GPU的速度(请参阅浏览器中的开发工具F12,以确定导致节流的原因)。顺便说一句,FPS不限于60。我不确定是否有限制,我见过它在高端电脑上以75的速度运行