我有一个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,OES_standard_derivatives,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的检测标准是:
WEBKIT_WEBGL_compressed_textures
当然,如果SwiftShader将来添加压缩纹理支持,这会再次破坏。但我无法通过软件渲染器看到压缩纹理的优势!此外,如果有许多不支持WEBKIT_WEBGL_compressed_textures
的实际工作视频卡,它仍然会有很多误报!
有没有更好的方法来检测SwiftShader?
答案 0 :(得分:2)
转到http://code.google.com/p/angleproject/wiki/ExtensionSupport查看EGL扩展EGL_ANGLE_software_display,如果可用,那是因为有一个SwiftShader后端。
答案 1 :(得分:1)
SwiftShader实际上比某些集成显卡更快。因此,检测GPU或CPU渲染无法保证实际性能。此外,SwiftShader是最快的软件渲染器,应该用简单的游戏做一个非常体面的工作。您确定您的应用程序已正确优化吗?
答案 2 :(得分:1)
你说你不想写一个“启动性能测试” - 也就是说,使用2D和WebGL渲染几帧并测量更快,然后使用那个 - 但是我仍然认为这是最好的选择。
缺点:
优点:
解决您的具体问题:
答案 3 :(得分:0)
你真正想知道的是,用Canvas2D而不是WebGL呈现你的游戏会更好。这与它是否在Swiftshader之上运行并不是同一个问题。
老实说,我不知道为什么要求用户是不可接受的。
许多有史以来最畅销的游戏都有这些选项,包括