我有一个简单的 Android 应用程序,它使用我们的 OpenGL 渲染 SDK 将数据渲染到 Android GLSurfaceView
。由于我们提供 SDK 供其他人使用,我们需要支持 GLSurfaceViews 的所有用例。目前,我们需要能够旋转设备,同时重新创建所有 Android 视图并保持 OpenGL 上下文处于活动状态。这源于客户在横向和横向模式下需要不同的布局。
正常的处理方式是:
1.添加android:configChanges="orientation|screenSize"
到您的活动中AndroidManifest.xml
,您会没事的。
这在这种情况下不起作用,因为这不会重新创建旋转视图。因此,通过这样做,我们不能在横向和横向模式下拥有不同的布局。
2.调用GLSurfaceView.onPause()
和GLSurfaceView.onResume()
从Activity
。
虽然这被认为是一种好的做法,但在这个用例中还不够,因为这样做时 OpenGL 上下文会被破坏。请注意,我们仍在这样做,它只是不能解决我们的问题。
3. 在旋转时使用EGLContextFactory
来保留 OpenGL 上下文。
如本答案中所述,这是可能且有用的。感觉就像一个黑客,但它绝对有效。EGLContext
这个想法很简单,当你没有一个时创建一个,并在你拥有的时候重用它。
我们在使用这个 hack 时面临的主要问题是渲染线程在GLSurfaceView
被分离并重新附加到视图层次结构时被破坏并重新创建。通过查看GLSurfaceView 实现,这似乎是设计使然。
在我们的 SDK 中,我们有一些线程本地存储连接到线程,所以突然获得一个新的渲染线程并不是很理想。当渲染线程发生变化时,我们可能会改变一些状态,但我们想研究是否有更好的方法来做到这一点。
所以我的问题是:
A. 是否使用EGLContextFactory
“正确”的方式来手动保存旋转时的 OpenGL 上下文?
B. 有什么方法可以在旋转时不破坏和重新创建渲染线程(不修改源)?
C. 在保持 OpenGL 上下文和渲染线程的同时,有没有更好/更简单的替代方案来实现视图销毁/重新创建的旋转?
额外信息:
- 我们总是打电话
setPreserveEGLContextOnPause(true);
。 - 渲染本身没有问题,只是描述的相关问题有问题。