2012-07-30 59 views

回答

16

是的,當然可以。

首先,你需要在一個線程創建上下文:

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()); 
} 

然後你可以從任何線程

+0

嗨創建紋理,着色器負載等,我我遭受了2個opengl線程的同步。除了makeCurrent之外,還應該照顧其他人? 有沒有一些文章介紹這一點? – dragonfly 2017-03-07 06:20:13

+0

要獲取完整樣例,你可以看看這個源代碼: https://github.com/klhurley/EffectsManager/blob/master/src/Android/Renderer.cpp – 2017-05-25 18:19:34

相關問題