15

Android の場合、GLSurfaceViewドキュメントには次 のように記載されています。

アクティビティが一時停止および再開されたときに、GLSurfaceView に通知する必要があります。GLSurfaceView クライアントは、アクティビティが一時停止するときに onPause() を呼び出し、アクティビティが再開するときに onResume() を呼び出す必要があります。これらの呼び出しにより、GLSurfaceView はレンダリング スレッドを一時停止および再開でき、GLSurfaceView は OpenGL ディスプレイを解放して再作成することもできます。

だから私は私の活動でこのようなことをすることになっています:

public void onPause() {
    myGlSurfaceView.onPause();
}

public void onResume() {
    myGlSurfaceView.onResume();
}

コードで、呼び出しを行わずonPause()onResume()ホーム ボタンを押してもコンテキストが失われないことを確認しているため、アプリケーションを切り替えてからゲームに戻ると、すべてが機能しています。私が見ているのは、戻るボタンを使用してゲームを閉じると、もう一度開いたときに画面が黒くなるということですが、戻るボタンの動作を変更してゲームを完全に閉じて、この問題を回避できます。

だから私の質問は: OpenGLコンテキストはいつ破棄されますか? 私が電話しなければonPause()onResume()それは決して破壊されないと仮定できますか?

編集:

私は Android 2.2 をターゲットにしているので、setPreserveEGLContextOnPause()私にはオプションではありません。

4

2 に答える 2

27

OpenGL は、Activity::onPause() が呼び出された後にのみ失われる可能性があり、この場合のみです。setPreserveEGLContextOnPauseのドキュメントを参照してください。

EGL コンテキストが実際に保持されるかどうかは、プログラムが実行されている Android デバイスが任意の数の EGL コンテキストをサポートできるかどうかによって異なります。限られた数の EGL コンテキストしかサポートできないデバイスは、複数のアプリケーションが GPU を共有できるようにするために、EGL コンテキストを解放する必要があります。[...] EGL コンテキストは、GLSurfaceView が一時停止されたときに解放され、GLSurfaceView が再開されたときに再作成されます。

編集:ドキュメントに記載されている状況は、すべての Android バージョンで有効です。あなたがアクセスできるかどうかは関係ありませんsetPreserveEGLContextOnPause

私の意見では、これは Android OGLES 実装の大きな欠点の 1 つです。確信は持てません。

ドキュメント自体はあいまいです (EGL Context Lost note) :

EGL レンダリング コンテキストが失われる状況があります。これは通常、デバイスがスリープ状態から復帰したときに発生します

ホームと戻るボタンについて、あなたと同じ動作に気付きました。呼び出しはまったく同じではありません (ただし、正確に覚えることはできません)。

OpenGL コンテキストが利用可能であることを確認する唯一の方法は、onSurfaceCreatedですべての OpenGL リソースを作成することです。

setPreserveEGLContextOnPauseに関する注意。繰り返しになりますが、このドキュメントのコメント は、コンテキスト破棄の「ランダムな」動作を示しています。

true に設定すると、GLSurfaceView が一時停止されたときにEGL コンテキストが保持される場合があります。[...]

于 2012-06-19T13:54:07.603 に答える
1

setPreserveEGLContextOnPause はオプションです。GlSurfaceView を自分で実装する必要があります。

同様の質問に対する私の回答をここで参照してください。 onPause が OpenGL コンテキストを破棄しないようにする

于 2012-06-23T08:18:11.303 に答える