退出MediaPlayer后,OpenGL上下文被销毁。

3
我们有一个增强现实应用程序,当指向特定标记时,会显示视频或3D模型。这个功能很好,但是一旦我们通过“返回”按钮退出MediaPlayer活动,OpenGL上下文似乎被销毁了。然后应用程序重新启动并需要重新加载所有资产,包括3D模型,这会导致大约10-15秒的延迟,我们想要防止这种情况。
我已经阅读了有关setPreserveEGLContextOnPause(true)的文章,并将其放在我们的GLSurfaceView中(我们有一个3.x平板电脑),但似乎没有起作用(需要实现其他内容才能使其工作吗? 我几乎找不到可用的文档)。
我不确定问题可能出现在我们的应用程序的哪个位置,我认为我们的GLSurface可能被销毁了,而我们没有注意到它。
从MediaPlayer退出的代码如下:
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK)) {            
        this.finish();

        Intent intent = new Intent(MediaPlayerActivity.this, OpenGLActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        this.startActivity(intent);
    }
    return super.onKeyDown(keyCode, event);
}

有什么提示可以保留OpenGL上下文,或退出MediaPlayer而不破坏我们的主要活动?

1
你有检查过你的设备实际支持多少个独立的GL上下文吗?专业提示是创建两个新的测试活动,并在onKeyDown(int, KeyEvent)中转换到这些活动,一个完全不使用GL,另一个显示一个简单的GLSurfaceView。媒体播放器很可能需要自己的GL上下文,迫使平板电脑回收你的上下文。 - Jens
1
所以我尝试调用一个显示简单Toast()(而不是媒体播放器)的测试活动,并返回到GL活动。相同的结果,GL上下文消失了。我注意到他似乎正确地调用了GL活动的* onCreate() onResume(),但无法调用SurfaceView的 onResume()*,因为它为空。 - Lennart
1
在这种情况下,难道不是所有的Activity都会被重新创建吗?一旦onCreate被调用,你应该重新创建你的视图。你可以做的是回收你的Renderer,例如使用Activity.onRetainNonConfigurationInstance()并在onCreate()中重复使用它(如果找到)。在那里,你可以至少存储你的模型以防止需要重新加载它。 - harism
1
onRetainNonConfigurationInstance() 可能不起作用,因为 onDestroy() 从未被调用。GLSurfaceView 在从另一个活动恢复后就会丢失。 - Lennart
1个回答

1
为了解决这个问题,我们将MediaPlayer放在SurfaceView层上,它将显示在我们的OpenGL内容上方。根据标记,我们只需显示或隐藏该层并防止切换上下文。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接