我在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)
错误是因为:
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);
传递的配置是:8,8,8,8,24
尽管在最后移动上面的行。这是什么原因?
PS:在任何一种情况下,代码在Nexus5或MotoG上都能正常工作。 所有运行Kitkat 4.4.2的设备
答案 0 :(得分:9)
我没有在documentation中明确指出,但是通过查看GLSurfaceView
的{{3}},setEGLContextClientVersion()
的情况确实如此。必须在 setEGLConfigChooser()
之前调用。
不会复制任何代码,因为我不确定这是否会侵犯版权,但如果您提取上述代码链接,则可以按照以下步骤操作:
setEGLContextChooser()
的重载实例化了一个新的ComponentSizeChoser
,并将指定的大小传递给构造函数。ComponentSizeChooser
的构造函数调用基类构造函数,将打包到配置规范中的指定大小传递给基础构造函数。基类是BaseConfigChooser
。BaseConfigChooser
的构造函数调用私有方法filterConfigSpec()
,并将配置规范传递给它,filterConfigSpec()
查看mEGLContextClientVersion
成员变量的值,并使用它来确定EGL_RENDERABLE_TYPE
属性的值,并将其添加到配置规范中。然后它返回带有此附加属性的配置规范。BaseConfigChooser
构造函数,修改后的配置规范将分配给成员变量。chooseConfig()
方法时使用,其中选择了实际配置。 mEGLContextClientVersion
是setEGLContextClientVersion()
设置的值。因此,如果在setEGLContextClientVersion()
之前调用setEGLContextChooser()
,则此方法设置的值将仅包含在配置选择中。
某些设备提供支持ES 1.X和ES 2.0 / 3.0的配置,而其他设备则提供1.X和2.0 / 3.0支持的单独配置。这很可能是因为上下文创建成功的原因是&#34;错误&#34;在某些设备上订购,而在其他设备上则失败。