我有一个 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_s3tc
在GL_ARB_texture_compression
桌面卡上得到广泛支持。此外,该表似乎只列出了相当旧的型号,所以我可以猜测所有现代桌面显卡都会支持WEBKIT_WEBGL_compressed_textures
......因此我对 SwiftShader 的检测标准是:
- 视窗操作系统
- 谷歌浏览器
- WebGL 上下文不支持
WEBKIT_WEBGL_compressed_textures
- 结果:退回到 Canvas 2D
当然,如果 SwiftShader 将来添加压缩纹理支持,这将再次中断。但是我看不到使用软件渲染器压缩纹理的优势!此外,如果那里有许多不支持的真正工作的视频卡,它仍然会得到很多误报WEBKIT_WEBGL_compressed_textures
!
没有更好的方法来检测 SwiftShader 吗?