【发布时间】:2012-07-04 05:27:16
【问题描述】:
您好,我最近一直在 android ndk 上使用 OpenGL ES 1.1,但我遇到了一个问题。发生的事情是我在屏幕上呈现一个简单的红色方块,当我启动应用程序时,方块完美显示,但是当我点击主页按钮并返回应用程序时,方块不再显示。我尝试在调用glDrawArrays 后调用getError 以查看是否发生错误并且它总是返回GL_NO_ERROR。我在 android 网站上读到以下内容:
在某些情况下,EGL 渲染上下文会丢失。 这通常发生在设备在进入睡眠状态后唤醒时。什么时候 EGL 上下文丢失,所有 OpenGL 资源(例如纹理) 与该上下文相关联的将被自动删除。在 为了保持正确渲染,渲染器必须重新创建任何丢失的 它仍然需要的资源。 onSurfaceCreated(GL10, EGLConfig) 方法是一个方便的地方。
我所做的是在活动的每个阶段都在 log cat 上打印,当点击主页按钮并返回应用程序时,系统没有调用 onSurfaceCreated。我还尝试在 log cat 中打印我的顶点,以检查它们是否以某种方式被破坏,而我只是向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 调用。
让我感到奇怪的是,当我在手机上按下主页按钮后再次运行应用程序时,系统会调用函数onSurfaceChanged 两次。不确定它是否与其他任何事情有关,只是很奇怪。
如果有人可以帮助我,我将不胜感激:D
【问题讨论】:
标签: android opengl-es android-ndk java-native-interface