9
是否允許從main()創建egl上下文並從另一個線程渲染,因爲上下文句柄是從main()傳遞給線程的函數的?egl - 可以在線程之間共享上下文
是否允許從main()創建egl上下文並從另一個線程渲染,因爲上下文句柄是從main()傳遞給線程的函數的?egl - 可以在線程之間共享上下文
是的,當然可以。
首先,你需要在一個線程創建上下文:
EGLint contextAttrs[] = {
EGL_CONTEXT_CLIENT_VERSION, 2,
EGL_NONE
};
LOG_INFO("creating context");
if (!(m_Context = eglCreateContext(m_Display, m_Config, 0, contextAttrs)))
{
LOG_ERROR("eglCreateContext() returned error %d", eglGetError());
return false;
}
然後在其他線程創建一個共享的情況下是這樣的:
EGLint contextAttrs[] =
{
EGL_CONTEXT_CLIENT_VERSION, 2,
EGL_NONE
};
if (m_Context == 0)
{
LOG_ERROR("m_Context wasn't initialized for some reason");
}
// create a shared context for this thread
m_LocalThreadContext = eglCreateContext(m_Display, m_Config, m_Context, contextAttrs);
當然,你必須有一些互斥/信號量來同步您想要使用GLES進行的任何更新。舉例來說,你需要給其他線程之前,在線程中做
eglMakeCurrent(m_Display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
可以撥打
if (!eglMakeCurrent(m_Display, m_Surface, m_Surface, m_Context))
{
LOG_ERROR("eglMakeCurrent() returned error %d", eglGetError());
}
然後你可以從任何線程
嗨創建紋理,着色器負載等,我我遭受了2個opengl線程的同步。除了makeCurrent之外,還應該照顧其他人? 有沒有一些文章介紹這一點? – dragonfly 2017-03-07 06:20:13
要獲取完整樣例,你可以看看這個源代碼: https://github.com/klhurley/EffectsManager/blob/master/src/Android/Renderer.cpp – 2017-05-25 18:19:34