Opengl es 处理OpenGL ES 2.0驱动程序错误 我目前正在使用NDK移植一个3D iC++游戏。渲染是使用GLES2完成的。当我重写完所有特定于平台的内容并第一次运行整个游戏时,我注意到渲染错误——有时只渲染部分几何体,有时巨大的三角形会在屏幕上闪烁,等等

Opengl es 处理OpenGL ES 2.0驱动程序错误 我目前正在使用NDK移植一个3D iC++游戏。渲染是使用GLES2完成的。当我重写完所有特定于平台的内容并第一次运行整个游戏时,我注意到渲染错误——有时只渲染部分几何体,有时巨大的三角形会在屏幕上闪烁,等等,opengl-es,android-ndk,opengl-es-2.0,Opengl Es,Android Ndk,Opengl Es 2.0,我在运行4.1.2的Galaxy Nexus上测试了它glGetError()未返回任何内容。此外,这款游戏在所有iOS设备上都运行良好。我开始怀疑一个驱动程序错误,在搜寻了好几个小时后,我发现使用VAOs(GL\u OES\u vertex\u array\u object)导致了这个问题。相同的渲染器在没有VAOs的情况下工作良好,并使用VAOs生成垃圾 我找到了这个。我还看到了同一份报告,一名工作人员证实这确实是一个驱动程序错误 所有这些都让我思考——我该如何处理已确认的驱动程序错误案例?

我在运行4.1.2的Galaxy Nexus上测试了它
glGetError()
未返回任何内容。此外,这款游戏在所有iOS设备上都运行良好。我开始怀疑一个驱动程序错误,在搜寻了好几个小时后,我发现使用VAOs(
GL\u OES\u vertex\u array\u object
)导致了这个问题。相同的渲染器在没有VAOs的情况下工作良好,并使用VAOs生成垃圾

我找到了这个。我还看到了同一份报告,一名工作人员证实这确实是一个驱动程序错误

所有这些都让我思考——我该如何处理已确认的驱动程序错误案例?我看到两种选择:

  • 不在Android设备上使用VAOs
  • 将特定设备和驱动程序版本列入黑名单,并且不在这些设备上使用VAO
  • 两种选择我都不喜欢。
    选项1将惩罚所有拥有优秀驱动程序的用户。VAOs确实提高了性能,我认为忽略它们是一件非常糟糕的事情,因为一台设备有一个bug。
    第二个选择是很难做对的。我无法测试每台Android设备是否有损坏的驱动程序,我希望列表会不断变化,难以跟上


    有什么建议吗?是否有一种方法可以在运行时检测此类驱动程序错误,而不必手动测试每台设备?

    Android上OpenGL ES驱动程序中的错误是众所周知的,因此完全有可能在驱动程序中存在错误。特别是如果您使用一些高级(未经良好测试)功能,如GL扩展

    在大型Android项目中,我们通常使用以下检查表来解决此问题:

  • 彻底测试和调试我们自己的代码,并对照OpenGL规范进行检查,以确保我们没有滥用任何API
  • 谷歌的问题(!!!)
  • 联系芯片组供应商(通常他们的网站上有一个表单,可以提交开发者的bug,但是一旦你成功提交了2-3个真正的bug,你就会知道可以提供帮助的人的直接电子邮件),并向他们展示你的代码。有时他们在驱动程序中发现bug,有时他们发现API误用
  • 如果该功能在一些设备上不起作用,只需创建一个变通方法或退回到传统的渲染路径即可
  • 如果大多数顶级设备都不支持该功能,请不要使用它,等市场准备好后,您可以添加它

  • OpenGL驱动程序错误可能是一个主要的PITA。我遇到过着色器优化和纹理格式错误的问题。已设法修改代码,以便以正确的方式在所有GPU上工作。在您的情况下,很难找到比硬编码设备/驱动程序版本检查更好的解决方案——否则您将不得不放弃使用VAO。我在第三方库中看到过一些这样的检查。我想到的一件事是黑名单,但有一个菜单选项,可以让你进入“兼容模式”,并禁用危险的功能,如VAOs。。。如果您这样做,我强烈建议(a)收集关于选择该选项的用户正在使用的设备/版本的分析,以及(b)与我和社区其他人共享该列表,以便我们可以从一个更好的黑名单开始未来的项目!