2012-06-16 4 views
13

は、GLSurfaceViewドキュメントは、この氏は述べています:アクティビティが一時停止されたときにAndroid:OpenGLコンテキストが破棄されるのはいつですか? Android上

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

だから私は、私の活動にこのような何かを行うことになってる:

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

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

私はonPause()onResume()を呼び出さない場合は、コンテキストが失われていないというのが私のコードで観察していますホームボタンを押すと、アプリケーションを切り替えてからゲームに戻り、すべてが機能しています。私が見ているのは、バックボタンを使用してゲームを終了すると、再び開いたときに画面が黒くなりますが、バックボタンの動作を変更してゲームを完全に終了し、この問題を回避できることです。

私の質問は次のとおりです。OpenGLのコンテキストが破棄されたのはいつですか?私がonPause()onResume()に電話しないと、決して破壊されないと思いますか?

EDIT:

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

+0

は、同様の質問には、ここで私の答えを参照してください。これがtrueに設定されていると、コンテキストが保持されます。詳細については、http://developer.android.com/reference/android/opengl/GLSurfaceView.html#setPreserveEGLContextOnPause(boolean)をご覧ください。 –

+0

@RodHyde申し訳ありませんが、私はAndroid 2.2をターゲットにしていると忘れていました。 – Damian

+0

ここでは、描画にGLSurfaceを使用するコードがあります。 http://code.google.com/p/andengine/source/browse/src/org/anddev/andengine/opengl/view/GLSurfaceView.java?r=ef54dd94f1fe8fa9ed134d993802c3c9974d3a84 –

答えて

24

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

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

編集:このドキュメントに記載されている状況は、すべてのAndroidバージョンで有効です。あなたにアクセスできないsetPreserveEGLContextOnPause

私の意見では、これはAndroid OGLESの実装です:あなたは確信することはできません。

documentation自体が(EGLコンテキストロストノート)あいまいです:

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

私は、[ホーム]ボタンと[戻る]ボタンと同じ動作に気付きました。コールはまったく同じものではありませんが、正確にはそれらを覚えていません。

OpenGLコンテキストが使用可能であることを確認するための唯一の方法は、onSurfaceCreated

注意についてsetPreserveEGLContextOnPause内のすべてのOpenGLのリソースを作成することです。もう一度、このdocumentation commentがコンテキスト破壊の「ランダム」の挙動を示しています。trueに設定した場合GLSurfaceViewが一時停止されたときに

、その後、EGLコンテキストを保存することができます。 [...]

+0

申し訳ありませんが、Android 2.2をターゲットにしていると忘れました – Damian

+0

私はAndroid 2.2でも動作します。この場合、setPreserveEGLContextOnPauseは利用できませんが、OpenGLのコンテキストが失われる方法は変わりません。 – rockeye

+0

それでも私には明らかです。ですから、私がGLSurfaceViewのonPause()を呼び出して確認を求めた後で、アプリケーションを閉じるためにバックキーを処理しないと、コンテキストは決して破壊されません。 – Damian

1

setPreserveEGLContextOnPauseはあなたのためのオプションです.GlSurfaceViewを自分で実装する必要があります。 )私はmyGlSurfaceView.getPreserveEGLContextOnPause(の価値を知りたいだろう Prevent onPause from trashing OpenGL Context

+0

GlSurfaceViewの実装を使用しているAdrenoデバイスはどうなりますか? – Damian

関連する問題