我有一个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,WEBKIT_WEBGL_lose_context,WEBKIT_WEBGL_compressed_textures
请注意添加WEBKIT_WEBGL_compressed_textures.一些快速研究表明,这可能会或可能不会得到广泛支持.请参阅this support table – 桌面卡上广泛支持GL_EXT_texture_compression_s3tc和GL_ARB_texture_compression.此外,该表似乎只列出了相当旧的型号,因此我可能会猜测所有现代桌面图形卡都支持WEBKIT_WEBGL_compressed_textures …因此我对SwiftShader的检测标准是:
> Windows操作系统
>谷歌Chrome浏览器
> WebGL上下文不支持WEBKIT_WEBGL_compressed_textures
>结果:回退到Canvas 2D
当然,如果SwiftShader将来添加压缩纹理支持,这又会再次破坏.但我无法通过软件渲染器看到压缩纹理的优势!此外,如果有许多不支持WEBKIT_WEBGL_compressed_textures的实际工作视频卡,它仍然会有很多误报!
有没有更好的方法来检测SwiftShader?