2017-03-13 4 views
2

J'ai un problème ..ne peut pas libérer fil dans OpenGLES sur Android

Quand appeler la fonction, eglReleaseThread(), immédiatement après l'application est fermée sans aucune valeur de retour sur le dispositif spécifique qui est «Galaxy S4. autres périphériques (galaxy note2,3 galaxy S7) ne font pas l'erreur. J'utilise JNI pour openGLES 2.0 et le périphérique spécifique a la version 4.3 (API 18)

Ceci est la version du code source.

if (mEGLDisplay != EGL_NO_DISPLAY) { 
    CppLog("env - release - exist display"); 
    if(!eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)){ 
     CppError("ImageProcGLES - eglMakeCurrent"); 
     return -1; 
    } 
    else{ 
     CppLog("env - release - eglMakeCurrent"); 
    } 

    if(!eglDestroySurface(mEGLDisplay, mEGLSurface)){ 
     CppError("ImageProcGLES - eglDestroySurface Error."); 
     return -1; 
    } 
    else{ 
     CppLog("env - release - eglDestroySurface"); 
    } 

    if(!eglDestroyContext(mEGLDisplay, mEGLContext)){ 
     CppError("ImageProcGLES - eglDestroyContext."); 
     return -1; 
    }else{ 
     CppLog("env - release - eglDestroyContext"); 
    } 

    if(!eglReleaseThread()){ 
     CppError("ImageProcGLES - eglReleaseThread."); 
     return -1; 
    }else{ 
     CppLog("env - release - eglReleaseThread"); 
    } 

    if(!eglTerminate(mEGLDisplay)){ 
     CppError("ImageProcGLES - eglTerminate."); 
     return -1; 
    }else{ 
     CppLog("env - release - eglTerminate"); 
    } 
} 
else{ 
    CppError("env - release - No Display"); 
} 

et ceci est retour log.

buffer - release 
    env - release - start 
    env - release - exist display 
    env - release - eglMakeCurrent 
    env - release - eglDestroySurface 
    env - release - eglDestroyContext 

Si vous avez une idée ... s'il vous plaît aidez-moi :(

+0

Cela ressemble à un bug dans le pilote de périphérique. Quel modèle spécifique du Galaxy S4 utilisez-vous? Certains sont basés sur des GPU SGX, d'autres sont basés sur des GPU Adreno. – solidpixel

+0

@solidpixel s'il est bug dans le lecteur de périphérique, comment résoudre le problème? Je ne sais pas exactement quel GPU est utilisé, peut-être c'est ** I9500/Corée du Sud modèle ** qui est basé sur «SGX544MP3» GPU –

+0

Vous ne pouvez pas le réparer. Contournement peut-être, mais ne le répare pas. La meilleure réponse est probablement d'éviter d'appeler 'eglReleaseThread()' ... en théorie toutes les ressources EGL devraient être libérées quand vous appelez 'eglTerminate()' de toute façon .. – solidpixel

Répondre

1

Il est un bogue dans le pilote EGL. Je l'habitude d'avoir la même question, de travailler autour d'elle créer la surface de la surface et EGL . pas SurfaceTexture Lorsque vous créez la surface:

mSurface = new Surface(mSurfaceTexture); 
      mEglSurface = EGL14.eglCreateWindowSurface(mEglDisplay, 
mEglConfig, mSurface, surfaceAttribs, 0); 

Moment clé ici est de créer surface de SurfaceTexture:

Surface surface = new Surface(mSurfaceTexture);