据我所知,当Android设备的方向改变时,Open GL ES会销毁onSurfaceCreated()和类似的方法并重新启动它们。换句话说,当方向改变时,一切都会重置,就像刚刚开始一样,因为就 opengl es 而言,它确实如此。我遇到的问题是我不希望它把渲染表面擦干净。我希望它继续下去,只是在风景中。重申一下:它保持不变,所有矩阵和对象位置,只是现在方向不同。我不知道该怎么做。我想也许保留旋转之前的最后一个状态,然后将其应用到新的渲染表面 - 这是一个好方法吗?所以我想我的问题是:当屏幕方向切换时,如何防止 OpenGL ES(2.0) 清除渲染表面(或幻觉)?
最佳答案
OpenGL ES 在方向改变期间不会破坏上下文或表面。 View
层次结构确实执行此操作; GLSurfaceView
特别喜欢发布它能找到的所有内容。
onSurfaceCreated()
回调与 Surfaces
和 Views
关联。当方向改变时,您会经历 Activity 生命周期事件,这些事件会拆除View
,然后它们又会拆除Surface
。如果这种情况没有发生,并且您继续渲染到同一个 Surface
中,那么您所做的一切都会看起来旋转了 90 度。 (请记住,SurfaceView
表面直接发送到系统合成器,而不是由应用程序与 UI 合成。)
通常的做法就是把所有东西都拆掉,然后再把它重建起来。
如果由于某种原因这不起作用,我建议您在屏幕外进行渲染,然后将纹理传输到当前表面。您可以在 Grafika's 中看到这样的示例“双重解码” Activity ,渲染成一对 SurfaceTextures
,并连接(并重新连接)到一对 TextureViews
。做同样事情的另一种方法是创建一个 FBO,渲染到其中,然后将其 blit 到您的 SurfaceView(您可以在 Grafika 的“Record GL app” Activity 中看到 FBO 设置/blit 的示例) )。
关于java - 防止 OpenGL ES 在方向切换时破坏 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22430170/