こんにちは、私は最近、Android ndk で OpenGL ES 1.1 をいじっていますが、問題が発生しています。アプリを起動すると正方形が完全に表示されますが、ホームボタンを押してアプリに戻ると、正方形が表示されなくなります。エラーが発生したかどうかを確認するために呼び出した後に呼び出してみましたが、常に が返されgetError
ます。Androidサイトで次のことを読みました:glDrawArrays
GL_NO_ERROR
EGL レンダリング コンテキストが失われる状況があります。これは通常、デバイスがスリープ状態から復帰したときに発生します。EGL コンテキストが失われると、そのコンテキストに関連付けられているすべての OpenGL リソース (テクスチャなど) が自動的に削除されます。正しくレンダリングし続けるために、レンダラーはまだ必要な失われたリソースを再作成する必要があります。onSurfaceCreated(GL10, EGLConfig) メソッドは、これを行うのに便利な場所です。
私がしたことは、アクティビティのすべての段階でログ猫に出力し、ホームボタンを押してアプリに戻ると、システムが呼び出していませんonSurfaceCreated
. また、log cat my vertices を印刷して、何らかの形で頂点が破壊され、間違った値を送信していることを確認しましたが、問題はなかっglVertexPointer
たようです。コードは次のとおりです。
static jint initialize(JNIEnv* env, jobject obj, jint width, jint height){
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glOrthof(0, width, height, 0, -1, 1);
glClearColor(100.0f/255.0, 149.0f/255.0f, 237.0/255.0f, 1.0f);
}
struct Vertex {
float Position[2];
float Texture[4];
};
static void gameRun(JNIEnv* evn, jobject obj) {
glClear(GL_COLOR_BUFFER_BIT);
const Vertex Vertices[] = {
{{ 0.0f, 100.0f }, { 1.0f, 0.0f, 0.0f, 1.0f }},
{{ 0.0f, 0.0f }, { 1.0f, 0.0f, 0.0f, 1.0f }},
{{ 100.0f, 100.0f }, { 1.0f, 0.0f, 0.0f, 1.0f }},
{{ 100.0f, 0.0f }, { 1.0f, 0.0f, 0.0f, 1.0f }},
};
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(2, GL_FLOAT, sizeof(Vertex), &Vertices[0].Position[0]);
glColorPointer(4, GL_FLOAT, sizeof(Vertex), &Vertices[0].Texture[0]);
GLsizei vertexCount = sizeof(Vertices) / sizeof(Vertex);
glDrawArrays(GL_TRIANGLE_STRIP, 0, vertexCount);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
}
注:関数initialize
は と から呼び出さonSurfaceCreated
れgameRun
ますonDrawFrame
。
私が奇妙に感じたことの 1 つは、ホーム ボタンの後に私の電話でアプリを再度実行すると、システムが関数をonSurfaceChanged
2 回呼び出すことでした。それが何かと関係があるかどうかはわかりませんが、ただ奇妙です。
誰かが私を助けてくれたら、本当に感謝しています:D