opengl-es - 处理 OpenGL ES 2.0 驱动程序错误

标签 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一名工作人员确认这确实是一个驱动程序错误。

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

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

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

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

    最佳答案

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

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

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

    相关文章:

    android - 在不重置预览或停止 MediaRecorder 的情况下录制视频

    iPhone glShader二进制

    Android TextureView/绘图/绘画性能

    java - 着色器乘法矩阵

    java - 如何通过触摸屏输入修改 Opengl 形状?

    Android - 访问预编译库中的 native 函数

    java - OpenGL ES,向圆添加纹理

    java - 从 JNI 返回三个 Mat 框架

    android - 有没有办法在 Android 上使用 OpenGL 在两个上下文/线程之间共享纹理?

    iphone - OpenGL ES 不再显示对象