GLSurfaceViewでEGL_BAD_ALLOC(eglSwapBuffers)

GLSurfaceViewの後始末でハマったのでメモ。

AndroidでOpenGLする場合、
GLSurfaceView.Rendererを継承したレンダラークラスを作り、GLSurfaceViewにsetRendererすると思います。

ここまでで満足してしまえばそれまでなのですが、ビューのタッチに反応しようとする場合、さらに、GLSurfaceViewを継承して独自のビューを作成します。

この状態では何にも問題ないのですが、GLSurfaceViewを継承したクラスで、surfaceDestroyedをオーバーライドしようとしたときに、謎のエラーが発生しました。

実機(X06HT HTC Desire)で実行してみたところ、アプリ実行中にホームボタンでホームに戻ろうとすると、強制終了してしまうのです。
(エミュレータでの実行ではなぜか問題なし)

ddmsで確認してみると、

06-28 17:33:36.602: ERROR/AndroidRuntime(28603): java.lang.RuntimeException: eglSwapBuffers failed: EGL_BAD_ALLOC

と出ています。

結局は、GLSurfaceViewを継承したクラスのsurfaceDestroyedで、super.surfaceDestroyed(holder);をコールしていなかったのが原因でした。

どうも、この中でGLThreadの停止処理などが行われていて、これが呼ばれないためにサーフェースが破棄されてもレンダリングしようとし、エラーとなっていたようです。

GLSurfaceViewを継承したクラスのsurfaceDestroyedで本来やりたかった処理を行った後、super.surfaceDestroyed(holder)をコールしてやることで、めでたく解決できました。

う~ん、疲れた・・・

Leave a Reply

This blog is kept spam free by WP-SpamFree.