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