我目前正在使用 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 个选项:
- 不在 Android 设备上使用 VAO。
- 将特定设备和驱动程序修订列入黑名单,并且不在这些设备上使用 VAO。
我不喜欢这两种选择。
选项 1 将惩罚所有拥有良好驱动程序的用户。VAO 确实提高了性能,我认为忽略它们是一件非常糟糕的事情,因为一个设备存在错误。
选项 2 很难做到正确。我无法测试每台 Android 设备是否有损坏的驱动程序,我希望列表会不断变化,因此很难跟上。
有什么建议么?有没有办法在运行时检测此类驱动程序错误而无需手动测试每个设备?