在Chrome 18中检测SwiftShader WebGL渲染器

时间:2012-05-04 21:40:56

标签: javascript performance google-chrome webgl

我有一个2D HTML5游戏引擎(www.scirra.com)并且真的想要检测WebGL是否要使用Chrome 18的'Swiftshader'软件渲染器进行渲染。如果是这样,我们很多更喜欢回归到普通的画布2D上下文,就像在其他浏览器中一样。那里的人群拥有低CPU的低端机器,在软件渲染时将游戏转变为幻灯片,我认为在很多情况下2D画布会被硬件加速。但是,在Chrome中WebGL上下文创建永远不会失败,并且没有明显的方法来检测SwiftShader。

我尝试过的事情:

// Always returns "WebKit WebGL" regardless of SwiftShader
gl.getParameter(gl.RENDERER)

// Always returns "WebKit" regardless of SwiftShader
gl.getParameter(gl.VENDOR)

我可以尝试考虑最大纹理尺寸或其他MAX_ *属性等问题,但是我怎么知道即使使用SwiftShader它们也不会在机器之间变化?而且我认为SwiftShader的目的是模仿常见的硬件,使用这种方法可能仍然会产生很多误报。

我不想写一个启动性能测试,因为:

  • 我们只是制造一个引擎,而不是任何特定的游戏,所以我不知道我们如何编写一个公平的测试,这个测试适用于任何性能配置文件的高精度游戏。
  • 一个好的测试可能需要一两秒才能完成运行,这可能会中断用户体验或让他们不得不看一些方块被转移或者其他什么
  • 它可能会产生新的复杂性,例如,如果我们缓存结果,如果用户更新其驱动程序并修复问题该怎么办?

我不想在Chrome上禁用WebGL,因为硬件加速的WebGL性能可以超过canvas 2D的两倍!如果我们这样做,每个人都会失败。

我不想添加游戏中的开关或用户设置,因为有多少用户关心它?如果游戏很慢,他们就会退出,很可能不会搜索解决方案。 “这场比赛很糟糕,我会去别的地方。”我认为只有少数用户会费心阅读“顺便说一句,如果这个游戏很慢,请尝试将此设置更改为'画布2D'......”

我目前最好的猜测是使用gl.getSupportedExtensions()。我发现SwiftShader报告了以下扩展:

OES_texture_float,OES_standard_derivatives,WEBKIT_WEBGL_lose_context

...但是真正的硬件加速上下文报告:

OES_texture_float,OES_standard_derivatives,WEBKIT_WEBGL_lose_context,WEBKIT_WEBGL_compressed_textures

请注意添加WEBKIT_WEBGL_compressed_textures。一些快速研究表明,这可能会或可能不会得到广泛支持。请参阅this support table - 桌面卡上广泛支持GL_EXT_texture_compression_s3tcGL_ARB_texture_compression。此外,该表似乎只列出了相当旧的模型,因此我可能会猜测所有现代桌面图形卡都支持WEBKIT_WEBGL_compressed_textures ...因此我对SwiftShader的检测标准是:

  • Windows操作系统
  • Google Chrome浏览器
  • WebGL上下文支持WEBKIT_WEBGL_compressed_textures
  • 结果:回退到Canvas 2D

当然,如果SwiftShader将来添加压缩纹理支持,这会再次破坏。但我无法通过软件渲染器看到压缩纹理的优势!此外,如果有许多不支持WEBKIT_WEBGL_compressed_textures的实际工作视频卡,它仍然会有很多误报!

有没有更好的方法来检测SwiftShader?

4 个答案:

答案 0 :(得分:2)

转到http://code.google.com/p/angleproject/wiki/ExtensionSupport查看EGL扩展EGL_ANGLE_software_display,如果可用,那是因为有一个SwiftShader后端。

答案 1 :(得分:1)

SwiftShader实际上比某些集成显卡更快。因此,检测GPU或CPU渲染无法保证实际性能。此外,SwiftShader是最快的软件渲染器,应该用简单的游戏做一个非常体面的工作。您确定您的应用程序已正确优化吗?

答案 2 :(得分:1)

你说你不想写一个“启动性能测试” - 也就是说,使用2D和WebGL渲染几帧并测量更快,然后使用那个 - 但是我仍然认为这是最好的选择。

缺点:

  • 您必须为两个渲染器加载资源,这可能会增加加载时间(但您可以记住选择,以便它只发生一次)。
  • 如果系统最初很慢(例如由于分页),则测量可能是错误的。

优点:

  • 选择在当前硬件上实际更快的渲染器,无论其明显属性如何。

解决您的具体问题:

  • 由于您正在编写游戏引擎,因此您必须为游戏开发人员提供指定要在测试中使用的样本内容的方法。
  • 一两秒不是额外的加载时间,特别是如果(我怀疑)没有可靠的方式来区分渲染器。在测试期间,无需使用户可见的画布元素;你可以呈现一个完全不相关的加载动画。

答案 3 :(得分:0)

你真正想知道的是,用Canvas2D而不是WebGL呈现你的游戏会更好。这与它是否在Swiftshader之上运行并不是同一个问题。

老实说,我不知道为什么要求用户是不可接受的。

许多有史以来最畅销的游戏都有这些选项,包括

  • 使命召唤现代战争3
  • 战地3
  • 愤怒的小鸟(http://chrome.angrybirds.com/)