在Chrome 18中检测SwiftShader WebGL渲染器

7
我有一个2D HTML5游戏引擎(www.scirra.com),想要检测Chrome 18的“Swiftshader”软件渲染器是否会呈现WebGL。 如果是这样,我们会更倾向于退回到普通的Canvas 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快两倍以上!如果我们这样做,每个人都会失败。

我不想添加游戏内开关或用户设置,因为有多少用户会关心这个?如果游戏很慢,他们只会退出,而且很可能不会寻找解决方案。"这个游戏烂透了,我去别的地方。" 我认为只有少数用户会费心阅读诸如“顺便说一句,如果这个游戏很慢,尝试将此设置更改为'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检测标准将是:

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

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

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


请记住,WEBKIT_WEBGL_compressed_textures扩展在Windows上可用,因为:1)它是一项实验性的硬件功能;2)Chrome / Windows上的硬件加速是通过ANGLE库完成的,该库是由Direct3D支持的OpenGL ES实现(在某些Intel板上比OpenGL具有更好的硬件支持)。因此,该标志直接与Direct3D压缩纹理支持相关。 - Chiguireitor
@Chiguireitor - 你是在说这个特定的扩展很常见,还是它是真正硬件支持的一个好指标?这会让人感到安心。 - AshleysBrain
不要只听我的话,直接查看项目 http://code.google.com/p/angleproject/ 我看到了Toji展示的纹理压缩演示,这几乎是硬件加速的明确迹象,但请记住a => b并不一定意味着b => a...在非当前硬件上,您将无法使用compressed_textures扩展。 - Chiguireitor
4个回答

2

问题是:目前没有办法验证EGL扩展(至少从JavaScript来看,您应该检查NaCl以查看是否可以从那里进行)。 - Chiguireitor
还有这个规范 http://www.khronos.org/registry/webgl/extensions/WEBGL_debug_renderer_info/,但它似乎还处于早期阶段。我认为你不应该指望这个问题很快得到解决,但在Chromium项目中发布一个问题也无妨,这可能会被标记为“Important-for-games”。 - Chiguireitor
有趣...但是名称意味着它只在特殊的调试情况下可用...我不确定它是否一直存在。此外,WebGL恐怕不会公开那个EGL扩展。 - AshleysBrain

2
您说您不想编写“启动性能测试”——即使用2D和WebGL渲染几帧并测量哪个更快,然后使用那个——但我仍认为这是最佳选择。
优点:
- 选择在当前硬件上实际更快的渲染器,而不考虑其表面属性。
缺点/注意事项:
- 您必须为两个渲染器加载资源,这可能会增加加载时间(但您可以记住选择,因此它只会发生一次)。 - 如果系统一开始很慢(例如由于分页),则测量可能是错误的。 - 没有主动冷却的硬件(例如手机)可能会在以后的某个时间过热并降低性能。您无法直接测量两种方法的热量输出。(如果您有一个好机会重新测量和重新选择渲染方法,例如在加载新级别时静态屏幕,您可以这样做。)
解决您的具体问题:
- 由于您正在编写游戏引擎,您将不得不为游戏开发人员提供指定用于测试的示例内容的方法。 - 一两秒钟的额外加载时间并不算太多,特别是如果(正如我怀疑的那样)没有其他可靠的区分渲染器的方法。在测试期间,您无需使正在使用的canvas元素对用户可见;您可以呈现完全不相关的加载动画。

1
我们只是制作了一个引擎,而不是任何特定的游戏,因此我不知道如何编写一个公平的测试,以在任何性能配置的任何游戏中都能高度准确地工作。 - AshleysBrain
@AshleysBrain 抱歉,我错过了你已经提到的选项。我已回复你的要点。 - Kevin Reid
我们有一个庞大的引擎,其中包含约1兆字节大小的JavaScript并不罕见。这意味着由于解析和JIT编译脚本,前几秒钟通常会有一些卡顿,直到脚本实际开始运行才可能完成这些操作,即完美地与我们开始进行性能测试的时刻相吻合。因此,我预计性能测试常规情况下将与其他处理密集型操作同时运行,从而破坏结果的准确性。你能想到解决这个问题的方法吗? - AshleysBrain

1

你真正想知道的是,将游戏呈现在Canvas2D中是否比WebGL更好。这不同于它是否运行在Swiftshader之上。

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

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

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

我在你提供的愤怒的小鸟游戏中没有看到WebGL vs. Canvas2D选项,只有一个SD/HD选项来切换屏幕大小。你提供的其他两个例子都是专业级桌面游戏,通常会有很多选项,但休闲游戏通常有很多路过用户,他们不太关心这些,所以最好不要为他们提供太多选项,特别是那些晦涩的技术选项。另外,我真正想知道的是哪个是硬件加速的,但实际上唯一的问题是Swiftshader。 - AshleysBrain
在《愤怒的小鸟》中,HD/SD采用WebGL还是Canvas2D?不,你不想知道它是否硬件加速。你想知道它是快还是慢。如果软件比某些垃圾硬件更快,为什么要选择硬件呢? - gman
由于硬件渲染器可以节省电池电量,同时释放CPU用于其他应用程序,即使速度较慢也是如此。此外,有大量用户使用低端机型,这些机型在进行软件渲染时性能很差,无法运行游戏,但通过使用硬件加速,则可以使其可玩。这是一个致命的问题。与之相比,在那些CPU强大到足以胜过其图形卡的用户数量可能要小得多的情况下,无论选择哪种方式都不会使游戏变得完全无法玩。因此,当可用硬件时使用软件渲染是一个更严重的问题。 - AshleysBrain

1

SwiftShader实际上比一些集成显卡更快。因此,检测GPU或CPU渲染并不能保证实际性能。此外,SwiftShader是最快的软件渲染器,并且应该可以在简单游戏中表现出色。您确定您的应用程序已经得到了适当的优化吗?


1
你说得没错,但是在某些电脑上,SwiftShader比加速硬件Canvas 2D要慢得多。这就是为什么AshleysBrain会问这个问题的原因。 - Chiguireitor
软件渲染:对于一些CPU性能较弱的用户来说,游戏体验不佳。硬件渲染:我敢说即使是使用性能较弱的GPU,也从来不会出现游戏无法运行的情况。我们不需要最快的,我们需要最适合的GPU。这样更加安全可靠。 - AshleysBrain
让我再提一个因素:完全模拟会产生更多的热量,会使风扇旋转或过热,甚至在游戏中降低CPU速度。从热量角度考虑,选择部分加速的选项会更安全。 - user185953

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接