Ash McConnell
Ash McConnell

Reputation: 1337

Losing OpenGL Textures in Android after a resume

My game is working correctly except in the case where I press the HOME button then resume. What needs to be done to use the textures again? I have tried calling onPause and onResume on the GLSurfaceView (when the activity's onPause and onResume are called).

Any ideas what I could be doing wrong?

Upvotes: 7

Views: 4752

Answers (3)

alexhilton
alexhilton

Reputation: 576

After trying:

  1. do not call GLSurfaceView#onPause/onResume in Activity's onPause/onResume
  2. call GLSurfaceView#onPause/onResume, but also set GLSurfaceView#setPreserveEGLContextOnPause(true)

Both of cases fix the HOME-resume-black-texture issue. Guess Android implementation failed to re-create the EGL context when resume. Since onPause/onResume are required to call, should always set setPreserveEGLContextOnPause to true.

Upvotes: 2

rockeye
rockeye

Reputation: 2773

Even if you fixed your problem, just to give a bit of explanation that might help others.

Android does not guaranty to keep the OpenGL context alive when the activity is paused.

You have to recreate every OpenGL-resources on resume (texture in you case, but also VBOs etc etc).

Since API 11, you can ask kindly Android to keep the context, but there is no guaranty it would.

Upvotes: 5

datenwolf
datenwolf

Reputation: 162164

If all else fails, reload the textures:

Pseudocode

for tex in textures:
    if glIsTexture(tex.opengl_name) == false:
        glGenTextures(1, &tex.opengl_name)

    glBindTexture(tex.texture_target);
    glTexImage(..., texture.image);

Upvotes: 6

Related Questions