4

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

我在运行 4.1.2 的 Galaxy Nexus 上对其进行了测试。glGetError()什么也没返回。此外,该游戏在所有 iOS 设备上运行良好。我开始怀疑是驱动程序错误,在搜寻了几个小时后,我发现使用 VAO ( GL_OES_vertex_array_object) 导致了问题。相同的渲染器在没有 VAO 的情况下工作得很好,但在使用 VAO 时会产生垃圾。

在 Google Code 发现了这个错误报告我也在 IMG 论坛上看到了同样的报告,一位工作人员证实这确实是一个驱动程序错误。

所有这一切让我思考 - 我如何处理已确认的驱动程序错误的情况?我看到 2 个选项:

  1. 不在 Android 设备上使用 VAO。
  2. 将特定设备和驱动程序修订列入黑名单,并且不在这些设备上使用 VAO。

我不喜欢这两种选择。
选项 1 将惩罚所有拥有良好驱动程序的用户。VAO 确实提高了性能,我认为忽略它们是一件非常糟糕的事情,因为一个设备存在错误。
选项 2 很难做到正确。我无法测试每台 Android 设备是否有损坏的驱动程序,我希望列表会不断变化,因此很难跟上。

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

4

1 回答 1

1

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

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

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