我正在使用OpenGL在Android中的GLSurfaceView上动态渲染图像。对于具有多个自定义GLSurfaceView实例的静态基于XML的布局,应用程序运行得非常完美(图像左上角和右上角)。
如果这些实例通过可见性值进行动态交换,则最后一个可见的OpenGL图像仍然位于新图像的顶部(图像底部左侧和右侧)。 左上图片:4个实例,正常大小 右上图片:4个实例,大尺寸 左下图片:1个实例,正常大小(左上图片作为不需要的叠加) 右下图片:1个实例,大尺寸(左上图片作为不需要的叠加) 我到目前为止尝试过的: - 没有删除不需要的实例:
- 通过android::visibility="gone"隐藏未使用的图像(效果不佳) - 将视图移出可见区域并将其调整为0x0大小 - 使用纯色代替动态图像以简化输出 - 通过使视图无效来强制重新绘制视图(实际上我几乎尝试了视图提供的每个函数) - 在onDraw()函数中清除各种缓冲区(实际上我几乎尝试了GLSurfaceView提供的每个函数) - 强制暂停渲染器的onPause()事件 - 使用ViewPager在视图之间切换
- 成功删除了不需要的实例:
- 通过重新进入应用程序重新启动OpenGL(无法像这样使用) - 通过android::visibility="gone"递归隐藏所有其他GLSurfaceView(会导致引擎出现错误,因此停止工作)
不需要的图像不会随布局回流而更改,例如视图的可见性更改。它们仅在一个GLSurfaceView位于另一个GLSurfaceView上时可见(通过android::visibility="gone"隐藏)。如果使用ImageView,则没有问题。第一个创建的实例没有这个问题,因为它位于子堆栈的顶部(或底部?)并位于其同级之上。
我猜Android只支持一个基于OpenGL的视图,该视图由所有GLSurfaceView实例使用。所有实例似乎共享一些偏好设置(特别是可见性),因此不能将其关闭或移出。 GLSurfaceView类:
如果这些实例通过可见性值进行动态交换,则最后一个可见的OpenGL图像仍然位于新图像的顶部(图像底部左侧和右侧)。 左上图片:4个实例,正常大小 右上图片:4个实例,大尺寸 左下图片:1个实例,正常大小(左上图片作为不需要的叠加) 右下图片:1个实例,大尺寸(左上图片作为不需要的叠加) 我到目前为止尝试过的: - 没有删除不需要的实例:
- 通过android::visibility="gone"隐藏未使用的图像(效果不佳) - 将视图移出可见区域并将其调整为0x0大小 - 使用纯色代替动态图像以简化输出 - 通过使视图无效来强制重新绘制视图(实际上我几乎尝试了视图提供的每个函数) - 在onDraw()函数中清除各种缓冲区(实际上我几乎尝试了GLSurfaceView提供的每个函数) - 强制暂停渲染器的onPause()事件 - 使用ViewPager在视图之间切换
- 成功删除了不需要的实例:
- 通过重新进入应用程序重新启动OpenGL(无法像这样使用) - 通过android::visibility="gone"递归隐藏所有其他GLSurfaceView(会导致引擎出现错误,因此停止工作)
不需要的图像不会随布局回流而更改,例如视图的可见性更改。它们仅在一个GLSurfaceView位于另一个GLSurfaceView上时可见(通过android::visibility="gone"隐藏)。如果使用ImageView,则没有问题。第一个创建的实例没有这个问题,因为它位于子堆栈的顶部(或底部?)并位于其同级之上。
我猜Android只支持一个基于OpenGL的视图,该视图由所有GLSurfaceView实例使用。所有实例似乎共享一些偏好设置(特别是可见性),因此不能将其关闭或移出。 GLSurfaceView类:
public class Panel extends GLSurfaceView implements Renderer {
private static native void nativeRender();
public Panel(Context context) {
super(context);
this.setRenderer(this);
this.setRenderMode(RENDERMODE_WHEN_DIRTY);
}
public void onDrawFrame(GL10 gl) {
nativeRender();
}
public void onSurfaceChanged(GL10 gl, int w, int h) {
gl.glViewport(0, 0, w, h);
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
super.surfaceDestroyed(holder);
}
public void callback() {
this.requestRender();
}
}
那么在一个OpenGL视图中使用多个视图(尤其是叠加的视图)是否可能?有没有更好的方法在不使用可见性值的情况下进行交换?