OpenGL ES の復帰処理について

618 views
Skip to first unread message

ケン

unread,
Nov 17, 2010, 10:03:31 AM11/17/10
to 日本Androidの会
皆さん、こんにちは、ケンです。

OpenGL ES は初心者ですが、
勉強も兼ねてOpenGL ES を使用した2Dアプリ作成をしようと思っており
色々なサンプルを見ながらプログラムをしています。

その中でアプリ復帰時のテクスチャ作成部分で
疑問に思った場所があったので投稿させていただきました。


今動作させているプログラムでは
SurfaceView をサブクラス、SurfaceHolder.Callback をインターフェース、
内部クラスに Thread を持つ一般的なGLSurfaceView で
surfaceCreated() = OpenGL ES の初期化、スレッドの開始、テクスチャの作成
surfaceChanged() = ビューポートの調整
surfaceDestroyd() = OpenGL ES の終了化、スレッドの終了
という流れになっています。

今の状態だとHomeボタンや電源オフなどで待機状態になると
通知が来て、テクスチャなどが全て破棄され
再開時にはまた一から全て作成を行う形になっています。

この再開時の部分で毎回毎回テクスチャを読み込むのは
復帰に時間が掛かると思い、できれば一度読み込んだテクスチャは
正常に終了した場合やタスクキルされるまで残しておきたいと考えています。


現在参考にさせていただいてるクリス・プルエット氏の「Spritemethodtest」では
描画スレッドを wait() で停止させ、
テクスチャの生成などは1度だけ行う作りになっていました。
ただ、復帰時には下記のように必ずサーフェイスに合わせたGLが生成されていました。
GL gl = mEglContext.getGL();

実機上では復帰後、問題無く表示されていますが、LogCat には
// Homeボタン押下一時停止時
ERROR/Surface(782): error locking buffer 0 (No such device)
ERROR/Surface(782): surface (id=1, identity=8367) is invalid, err=-19
(No such device)
ERROR/Adreno200-EGL(782): egliSwapWindowSurface: unable to dequeue
native buffer
ERROR/Surface(782): surface (id=1, identity=8367) is invalid, err=-19
(No such device)

// Homeボタン押下復帰時
ERROR/Surface(782): using an invalid surface id=1, identity=8367
should be 8370
ERROR/Adreno200-EGL(782): eglLockWindowSurface: unable to dequeue
native buffer

などのエラーが表示されていたため、やや不気味に思えてしまいました……

GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
などで生成したテクスチャは、GL を新しく生成しなおした場合
やはり面倒でも同じように作り直したほうがいいのでしょうか?


もし、有効な復帰処理をご存知の方がいらっしゃいましたら、
ご教授願えればと思います。
よろしくお願いいたします。
Reply all
Reply to author
Forward
0 new messages