处理OpenGL ES 2.0驱动程序错误

时间:2012-11-01 21:16:57

标签: opengl-es android-ndk opengl-es-2.0

我目前正在使用NDK将3D C ++游戏从iOS移植到Android。渲染是使用GLES2完成的。当我完成重写所有平台特定的东西并且第一次运行完整游戏时,我注意到渲染错误 - 有时只有部分几何体会渲染,有时巨大的三角形会在屏幕上闪烁,依此类推......

我在运行4.1.2的Galaxy Nexus上进行了测试。 glGetError()没有返回任何内容。此外,游戏在所有iOS设备上运行得非常漂亮。我开始怀疑一个驱动程序错误,并且在打猎了好几个小时之后我发现使用VAO(GL_OES_vertex_array_object)导致了麻烦。相同的渲染器在没有VAO的情况下工作正常,并且与VAO产生垃圾。

我发现了bug report at Google Code。我也看到同样的报告at IMG forums,一名工作人员证实这确实是一个驱动程序错误。

这一切让我想到 - 如何处理确认的驱动程序错误?我看到两个选项:

  1. 未在Android设备上使用VAO。
  2. 将特定设备和驱动程序修订列入黑名单,而不是在这些设备上使用VAO。
  3. 我不喜欢这两种选择 选项编号1将惩罚所有拥有良好驾驶员的用户。 VAO确实提升了性能,我认为忽略它们是非常糟糕的,因为一个设备有一个bug 选项编号2很难做到。我无法测试每个Android设备是否存在损坏的驱动程序,我希望该列表不断变化,这使得它很难跟上。

    有什么建议吗?是否有办法在运行时检测此类驱动程序错误而无需手动测试每个设备?

1 个答案:

答案 0 :(得分:1)

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

在一个大型Android项目中,我们通常使用以下清单来解决这个问题:

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