8

我有一个简单的 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);
  • 渲染本身没有问题,只是描述的相关问题有问题。
4

0 回答 0