在Samsung S4上打开GL错误配置错误

vj9*_*vj9 4 android opengl-es

我在Samsung S4上收到以下错误

10-21 16:25:44.100: E/AndroidRuntime(29778): FATAL EXCEPTION: GLThread 11320
10-21 16:25:44.100: E/AndroidRuntime(29778): Process: <bundle ID>, PID: 29778
10-21 16:25:44.100: E/AndroidRuntime(29778): java.lang.RuntimeException: createContext failed: EGL_BAD_CONFIG
10-21 16:25:44.100: E/AndroidRuntime(29778): at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1201)
10-21 16:25:44.100: E/AndroidRuntime(29778): at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1192)
10-21 16:25:44.100: E/AndroidRuntime(29778): at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:1042)
10-21 16:25:44.100: E/AndroidRuntime(29778): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1409)
10-21 16:25:44.100: E/AndroidRuntime(29778): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248)
Run Code Online (Sandbox Code Playgroud)

错误是因为:

this.setEGLContextFactory(new MyDefaultContextFactory());
this.setEGLConfigChooser(GL_RED_SIZE, GL_GREEN_SIZE, GL_BLUE_SIZE, GL_ALPHA_SIZE,
        GL_DEPTH_SIZE, 0);//<-this line
this.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR
        | GLSurfaceView.DEBUG_LOG_GL_CALLS);
this.setPreserveEGLContextOnPause(true);
this.setEGLContextClientVersion(2);
Run Code Online (Sandbox Code Playgroud)

通过的配置是:8,8,8,8,24

尽管在最后移动上面的行.这是什么原因?

PS:在任何一种情况下,代码在Nexus5或MotoG上都能正常工作.所有运行Kitkat 4.4.2的设备

Ret*_*adi 9

我没有看到它的在明确规定的文件,但看源代码GLSurfaceView,它确实似乎是案件setEGLContextClientVersion()必须被调用之前 setEGLConfigChooser().

不复制任何代码,因为我不确定这是否会侵犯版权,但是如果你拉出上面的代码链接,你可以跟进:

  1. setEGLContextChooser()代码中使用的重载实例化一个new ComponentSizeChoser,并将指定的大小传递给构造函数.
  2. 构造函数ComponentSizeChooser调用基类构造函数,将打包到配置规范中的指定大小传递给基础构造函数.基类是BaseConfigChooser.
  3. 构造函数BaseConfigChooser调用私有方法filterConfigSpec(),传递配置规范,
  4. filterConfigSpec()查看mEGLContextClientVersion成员变量的值,并使用它来确定EGL_RENDERABLE_TYPE属性的值,并将其添加到配置规范中.然后它返回带有此附加属性的配置规范.
  5. 回到BaseConfigChooser构造函数中,修改后的配置规范被分配给成员变量.
  6. 稍后在chooseConfig()调用方法时使用此成员变量中的配置规范,其中选择了实际配置.

mEGLContextClientVersion是由...设定的值setEGLContextClientVersion().因此,使用此方法设置的值只会在setEGLContextClientVersion()之前调用时包含在配置选择中setEGLContextChooser().

有些设备提供支持ES 1.X和ES 2.0/3.0的配置,而其他设备则提供1.X和2.0/3.0支持的单独配置.这很可能是因为在某些设备上上下文创建成功与"错误"顺序的调用成功,而在其他设备上失败则成功.