我正在为3D模型查看器工作。当我打开模型时,扩展GLSurfaceView的非VR视图(RenderView)加载。这是我在此视图中的setEGLContextFactory()方法中使用的上下文工厂(记录日志调用和错误检查):
public static class ContextFactory implements GLSurfaceView.EGLContextFactory {
private static int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) {
int[] attrib_list = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE };
EGLContext context = egl.eglCreateContext(display, eglConfig, EGL10.EGL_NO_CONTEXT,
attrib_list);
//Reference is need to use this context as share_context parameter.
RenderView.context = context;
return context;
}
public void destroyContext(EGL10 egl, EGLDisplay display, EGLContext context) {
egl.eglDestroyContext(display, context);
}
}
接下来我按“VR'按钮和视图扩展CardboardView(扩展GLSurfaceView)加载。这是它的上下文工厂:
public static class ContextFactory implements GLSurfaceView.EGLContextFactory {
private static int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) {
int[] attrib_list = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE };
EGLContext newContext = egl.eglCreateContext(display, eglConfig, RenderView.context, attrib_list);
return newContext;
}
public void destroyContext(EGL10 egl, EGLDisplay display, EGLContext context) {
egl.eglDestroyContext(display, context);
}
}
如您所见,它在eglCreateContext()方法中使用RenderView上下文作为share_context参数。我还在非VR视图上设置了预测EGLContextOnPause(true),因此在切换到VR模式后上下文不会丢失。
接下来我按下'返回"按钮,我们返回非VR视图(RenderView)。
所有EGLCOntextFactory方法都可以正常工作,并在需要时调用。当我切换回非VR模式时,VR上下文被正确销毁,但消耗的内存未被清除。
现在我再次进入VR模式,并创建另一个消耗内存的上下文。我回到非VR模式,VR上下文被破坏,但内存不再被清除。因此,每次切换到VR模式时,都会消耗越来越多的内存(每个交换机大约17 MB)。
完全清除内存(创建VR上下文的数量并不重要)仅销售非VR上下文(与VR上下文共享数据)(当我关闭非VR视图并进入模型选择屏幕时)。
所以问题是为什么在破坏后上下文存储器没有被清除,如果上下文是基于'在另一个背景下,只有在“基础”之后才会清除。上下文被破坏了?有没有办法通过GL方法解决这个问题?