我正在尝试使用OpenGL ES为Android编写一个小型游戏引擎.我创建了一个Game Thread来更新游戏对象和GLThread来绘制场景.我读过你需要在GLSurfaceView的onSurfaceCreated方法中加载纹理.我正在关注这个但是出于某些调试目的,我试图从我的游戏线程而不是GLThread加载纹理.我没有错误,纹理没有出现在屏幕上.我花了一整天的时间试图弄清楚问题,最后我在这里阅读了下面的内容
"只需确保在主线程中只使用OpenGL." 很重要.你不能在你的游戏引擎(可能在另一个线程中)中调用一个与gl-thread不同步的纹理加载函数.设置一个标志来指示你的gl线程加载一个新的纹理(例如,你可以在OnDrawFrame(GL gl)中放置一个函数,它检查是否必须加载一个新的纹理.
我将修改我的代码,以便从GL线程加载纹理.我只是不明白为什么会这样?为什么OpenGL函数不能从另一个线程起作用?
我知道如何创建线程,但我不知道同步意味着什么.上面的摘录提到,"你不能在游戏引擎中调用(可能在另一个线程中)一个纹理加载函数,它与gl-thread不同步." 所以我想我的游戏线程可能不会与GL线程同步.是否可以创建另一个与GL Thread同步的线程,以便可以从中调用GL函数?我应该在线程中学到什么才能理解这些概念?
我正在看android ndk opengl es的例子.无论如何,它有在那里的线:
int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE };
EGLContext context = egl.eglCreateContext(display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list);
Run Code Online (Sandbox Code Playgroud)
其中EGL_CONTEXT_CLIENT_VERSION定义为:
private static int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
Run Code Online (Sandbox Code Playgroud)
我一直在讨论该调用的API,它说最后一个参数是属性列表.但我似乎无法找到任何实际上提供你可能想要放在那里的属性的东西,或者甚至解释这个例子放在那里的两个属性.谁能告诉我这些属性是什么意思?(或者更好的是,还请指出一些解释它的文档).
谢谢
编辑:我刚刚意识到一些上下文会有所帮助.特定样本位于samples/hello-gl2中.该文件位于视图类中,特别是ContextFactory静态类.