如何在包含OpenGL上下文和GL线程的情况下使用GLSurfaceView正确旋转Android设备?

Krø*_*lle 6 android opengl-es glsurfaceview android-thread

我有一个简单的Android应用程序,使用我们的OpenGL渲染SDK将数据呈现给Android GLSurfaceView.由于我们提供和SDK供其他人使用,我们需要支持GLSurfaceViews的所有用例.目前,我们需要能够在重新创建所有Android视图并保持OpenGL上下文活动的同时旋转设备.这源于客户在横向和横向模式下需要不同的布局.

解决这个问题的正常方法是:

1.添加android:configChanges="orientation|screenSize"到您的活动中AndroidManifest.xml,您将没事.

这将不会在这种情况下,作为工作这不会重新上旋转的意见.因此,通过这样做,我们不能在横向和横向模式中具有不同的布局.

2.呼叫GLSurfaceView.onPause()GLSurfaceView.onResume()Activity.

虽然这被认为是一种很好的做法,但在这个用例中还不够,因为在执行此操作时会破坏OpenGL上下文.请注意,我们仍然这样做,它只是没有解决我们的问题.

3.使用a EGLContextFactory在旋转时保留OpenGL上下文.

这是可能的和有用的,例如在该答案中所描述的.感觉就像一个黑客,但它绝对有效.这个想法只是EGLContext在你没有一个时创建一个并重用你拥有的那个.

使用此hack时遇到的主要问题是渲染线程在GLSurfaceView分离并重新连接到视图层次结构时被销毁并重新创建.这似乎是通过查看GLSurfaceView实现来设计的.

在我们的SDK中,我们有一些线程本地存储连接到线程,所以突然得到一个新的渲染线程是不太可取的.我们可能会在渲染线程发生变化时更改某些状态,但我们想调查是否有更好的方法来执行此操作.

所以我的问题是:

答:使用EGLContextFactory"正确"的方式能够在旋转时手动保存OpenGL上下文吗?

B.有没有办法在旋转时不破坏和重新创建渲染线程(不修改源代码)?

C.在保持OpenGL上下文和渲染线程的同时,是否有更好/更简单的替代方法来实现视图销毁/重建的轮换?

额外信息:

  • 我们总是打电话setPreserveEGLContextOnPause(true);.
  • 渲染本身没有问题,只是所描述的相关问题是有问题的.