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

时间:2017-10-25 10:44:50

标签: 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。使用EGLContextFactory在旋转时保留OpenGL上下文。

这可能是有用的,例如this answer中所述。感觉就像一个黑客,但它绝对有效。我们的想法只是在您没有EGLContext时创建GLSurfaceView并重新使用您拥有的EGLContextFactory

使用此hack时遇到的主要问题是,当setPreserveEGLContextOnPause(true);被分离并重新连接到视图层次结构时,渲染线程将被销毁并重新创建。这似乎是通过查看the GLSurfaceView implementation来设计的。

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

所以我的问题是:

一个。正在使用app.factory('Card', [function() { function Card(cardData) { if (cardData) { this.setData(cardData); }else{ this.new(); } }; Card.prototype = { new: function(){ var cardData = { title: 'Add your recommendations', } this.setData(cardData); } }; return Card; }]); "正确的"能够在旋转时手动保存OpenGL上下文的方法吗?

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

℃。在保持OpenGL上下文和渲染线程的同时,是否有更好/更简单的替代方法可以实现视图破坏/重新创建旋转?

额外信息:

  • 我们总是致电{card: {title: 'demo_title'}}
  • 渲染本身没有问题,只是描述的相关问题是有问题的。

0 个答案:

没有答案