Threading textures load process for android opengl game

As explained in ‘OpenGLES preloading textures in other thread‘ there are two separate steps: bitmap creation and bitmap upload. In most cases you should be fine by just doing the bitmap creation on a secondary thread — which is fairly easy.

If you experience frame drops while uploading the textures, call texImage2D from a background thread. To do so you’ll need to create a new OpenGL context which shares it’s textures with your rendering thread because each thread needs it’s own OpenGL context.

EGLContext textureContext = egl.eglCreateContext(display, eglConfig, renderContext, null);

Getting the parameters for eglCreateContext is a little bit tricky. You need to use setEGLContextFactory on your SurfaceView to hook into the EGLContext creation:

@Override
public EGLContext createContext(final EGL10 egl, final EGLDisplay display, final EGLConfig eglConfig) {
     EGLContext renderContext = egl.eglCreateContext(display, eglConfig, EGL10.EGL_NO_CONTEXT, null);

     // create your texture context here

     return renderContext;
}

Then you are ready to start a texture loading thread:

public void run() {
    int pbufferAttribs[] = { EGL10.EGL_WIDTH, 1, EGL10.EGL_HEIGHT, 1, EGL14.EGL_TEXTURE_TARGET,
            EGL14.EGL_NO_TEXTURE, EGL14.EGL_TEXTURE_FORMAT, EGL14.EGL_NO_TEXTURE,
            EGL10.EGL_NONE };

    EGLSurface localSurface = egl.eglCreatePbufferSurface(display, eglConfig, pbufferAttribs);
    egl.eglMakeCurrent(display, localSurface, localSurface, textureContext);

    int textureId = loadTexture(R.drawable.waterfalls);

    // here you can pass the textureId to your 
    // render thread to be used with glBindTexture
}

I’ve created a working demonstration of the above code snippets at https://github.com/perpetual-mobile/SharedGLContextsTest.

This solution is based on many sources around the internet. The most influencing ones where these three:

Leave a Comment