根据标题,从暂停状态恢复后,GLSurfaceView为空白。渲染器onSurfaceCreated
,onSurfaceChanged
和onDrawFrame
在恢复后会被调用,但屏幕仍为空白!
以下是相关代码:
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glClearDepthf(1.0f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
boxWidth = 0.5f;
boxHeight = 0.5f;
boxCenter = new float[] { 0.5f, 0.5f };
Log.v("resume", "onSurfaceCreated");
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0, 1, 0, 1, -5, 5);
gl.glMatrixMode(GL10.GL_MODELVIEW);
viewHeight = height;
viewWidth = width;
Log.v("resume", "onSurfaceChanged");
}
@Override
public void onDrawFrame(GL10 gl) {
gl.glLoadIdentity();
float halfW = boxWidth/2.0f;
float halfH = boxHeight/2.0f;
float left = Math.max(boxCenter[0]-halfW, 0.001f);
float right = Math.min(boxCenter[0]+halfW, 0.999f);
float top = Math.min(boxCenter[1]+halfH, 0.999f);
float bottom = Math.max(boxCenter[1]-halfH, 0.001f);
boxHeight = Math.max(top - bottom, 0.05f);
boxWidth = Math.max(right - left, 0.05f);
boxCenter[0] = left + boxWidth/2.0f;
boxCenter[1] = bottom + boxHeight/2.0f;
float vertices[] = {
left, top, 0.0f,
left, bottom, 0.0f,
right, bottom, 0.0f,
right, top, 0.0f
};
ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4);
byteBuf.order(ByteOrder.nativeOrder());
vertexBuffer = byteBuf.asFloatBuffer();
vertexBuffer.put(vertices);
gl.glTranslatef(0.001f, -0.001f, -3.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT |
GL10.GL_DEPTH_BUFFER_BIT);
vertexBuffer.position(0);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0,
vertexBuffer);
gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 4);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
Log.v("resume", "drawing");
}
我已经读过你需要在onSurfaceChanged中重新创建GL上下文,但是我不确定如何,或者当我调用onSurfaceCreated时我已经这样做了。
请帮忙!
修改:
以下是包含GLSurfaceView的Activity中的onResume
代码:(此处称为GLSurface)
public void onResume() {
super.onResume();
if (mGLSurface != null) {
if (mRenderer != null) {
float[] center = new float[2];
center[0] = settings.getFloat("renderer_boxCenter0", 0.5f);
center[1] = settings.getFloat("renderer_boxCenter1", 0.5f);
mRenderer.setBoxCenter(center);
mRenderer.setBoxWidth(settings.getFloat("renderer_boxWidth", 0.5f));
mRenderer.setBoxHeight(settings.getFloat("renderer_boxHeight", 0.5f));
}
mGLSurface.onResume();
}
我没有为GLSurfaceView的onResume做太多工作,我没有发现任何文档表明我需要做任何特别的事情才能恢复我的EGL上下文。
编辑2:
我还要注意,不幸的是,在我的GLSurfaceView的构造函数中调用setPreserveEGLContextOnPause(true)
并没有解决我的问题。
答案 0 :(得分:4)
setPreserveEGLContextOnPause(真) 仅适用于Android 3.X及更高版本的设备。 (即使这样,它是否是设备特定的,是否支持)
您要查找的解决方案是在GlSurfaceView的父活动中,您在活动的onPause方法中调用GlSurfaceView.onPause(),在活动的onResume方法中调用GlSurfaceView.onResume()。
注意这会导致所有纹理和缓冲区丢失。此时需要重新加载它们。
答案 1 :(得分:0)
这是一个很长的镜头,但你是否尝试控制方向或配置更改(即你有public void onConfigurationChanged(Configuration config)
覆盖你的活动)?
我发现,如果我的活动中有onConfigurationChanges()
次覆盖,而我的清单文件中有android:screenOrientation="landscape"
,但android:configChanges="orientation"
我得到的内容与您描述的内容相似