A Workaround to Fix OpenGL eglSwapBuffers Freezing
Nov 20, 2012UPDATE: After the Galaxy S III upgraded to Android 4.1.1, the glFlush
can’t work any more!
In a recent OpenGL project, I found everything brilliant, until I tested the app on a Galaxy S III. In the Galaxy S III with a stock 4.0.4 ROM, the surface will be updated by a few frames, then stuck there, nothing continues, I can’t even stop it.
I enabled and disabled several OpenGL/EGL related invocations, then had a conclusion that all methods which may update the surface buffer can freeze or block the rendering, glClear
, glDrawArrays
, glDrawElements
and eglSwapBuffers
included in these methods.
After been racking my brain all night over this problem, I found some Android issues which may cause the EGL freezing, such as Android issue#6478. This issue is not quite the same as mine, and only reported to occur in Android versions prior to ICS.
But I still wanted to take a chance, so I added glFinish
just before eglSwapBuffers
, everything worked!
glFinish();
eglSwapBuffers(display, surface);
However, I got a great performance reduction, the FPS is only half of that when glFinish
removed. More strange, the Galaxy S has the same performance with or without glFinish
call.
I Think it’s a Galaxy S III bug, or why it’s slower than the Galaxy S?