6

我有一个 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 性能可以比画布 2D 快两倍!如果我们这样做了,每个人都会输。

我不想添加游戏内开关或用户设置,因为有多少用户关心这个?如果游戏速度很慢,他们就会退出并且很可能不会寻找解决方案。“这游戏糟透了,我去别的地方。” 我认为只有少数用户会费心阅读诸如“顺便说一下,如果这个游戏很慢,请尝试将此设置更改为‘canvas 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。一些快速研究表明,这可能会或可能不会得到广泛支持。请参阅此支持表- 两者都GL_EXT_texture_compression_s3tcGL_ARB_texture_compression桌面卡上得到广泛支持。此外,该表似乎只列出了相当旧的型号,所以我可以猜测所有现代桌面显卡都会支持WEBKIT_WEBGL_compressed_textures......因此我对 SwiftShader 的检测标准是:

  • 视窗操作系统
  • 谷歌浏览器
  • WebGL 上下文支持WEBKIT_WEBGL_compressed_textures
  • 结果:退回到 Canvas 2D

当然,如果 SwiftShader 将来添加压缩纹理支持,这将再次中断。但是我看不到使用软件渲染器压缩纹理的优势!此外,如果那里有许多不支持的真正工作的视频卡,它仍然会得到很多误报WEBKIT_WEBGL_compressed_textures

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

4

4 回答 4

2

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

于 2012-05-05T03:34:51.887 回答
2

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

优点:

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

缺点/注意事项:

  • 您必须为两个渲染器加载资源,这可能会增加加载时间(但您可以记住选择,以便它只发生一次)。
  • 如果系统一开始很慢(例如由于寻呼),则测量可能是错误的。
  • 没有主动冷却的硬件(例如手机)可能会在以后过热并降低性能。你不能直接测量这两种方法的热量输出。(如果你有很好的机会重新测量和重新选择渲染方法,例如加载新关卡时的静态屏幕,你可以这样做。)

解决您的具体问题:

  • 由于您正在编写游戏引擎,因此您必须为游戏开发人员提供一种方法来指定要在测试中使用的示例内容。
  • 一两秒并不是很多额外的加载时间,特别是如果(我怀疑)没有可靠的方法来区分渲染器。在测试期间,无需让用户看到您正在使用的画布元素;你可以呈现一个完全不相关的加载动画。
于 2012-05-05T11:15:32.607 回答
1

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

于 2012-05-05T02:09:11.183 回答
1

您真正想知道的是,用 Canvas2D 而非 WebGL 来展示您的游戏是否会更好。这与它是否在 Swiftshader 之上运行不是同一个问题。

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

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

  • 使命召唤现代战争3
  • 战地3
  • 愤怒的小鸟 (http://chrome.angrybirds.com/)
于 2012-05-04T23:40:04.493 回答