3

在同一个线程中渲染两个不同的surface时,eglMakeCurrent每次都需要调用解除当前surface与线程的绑定,并在渲染某个surface之前将另一个surface绑定到当前线程,而将一个surface与线程解除绑定的操作太费时间了!

源代码:

int DisplayPicture(...)
{   
    if (!eglMakeCurrent(m_glesDisplay ,m_glesSurface, m_glesSurface, m_glesContext))
    {
        return 0;
    }

    glUseProgram(programObject);

    glActiveTexture( GL_TEXTURE0 );
    glUniform1i(m_nUniformLocation[0],0);
    glBindTexture( GL_TEXTURE_2D, 0);

    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexImage2D( GL_TEXTURE_2D, 0, GL_LUMINANCE, nWidth, nHeight, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, pData );

    ....

    // Update attribute values.
    glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);
    glEnableVertexAttribArray(ATTRIB_VERTEX);
    glVertexAttribPointer(ATTRIB_TEXCOORD, 2, GL_FLOAT, 0, 0, texCoords);
    glEnableVertexAttribArray(ATTRIB_TEXCOORD);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    eglSwapBuffers(m_glesDisplay, m_glesSurface);
    glUseProgram(0);
    return 0;
}

ps: 1. 在OpenGLES中使用纹理,eglMakeCurrent(display, NULL, NULL, NULL)会耗费很长时间,为什么?2. 在某些设备中,在其他设备中eglMakeCurrent会正常返回EGL_BAD_ALLOC,为什么?

4

0 回答 0