防止OpenGL ES在切换方向时破坏画布

时间:2014-03-15 21:46:17

标签: java android opengl-es opengl-es-2.0 surfaceview

据我所知,当Android设备的方向发生变化时,Open GL ES会破坏onSurfaceCreated()和类似的方法并重新启动它们。换句话说,当方向改变时,一切都会被重置,好像它刚刚开始一样,因为就操作而言,它确实如此。我遇到的问题是我不希望它擦除渲染表面干净。我希望它继续下去,只有在风景中。重申:它保持不变,所有矩阵和对象位置,只是现在方向不同。我不知道怎么回事。我想到可能在旋转之前保留最后一个状态然后将它应用到新的渲染表面 - 这是一个很好的方法吗?所以我想我的问题是:当屏幕方向切换时,我如何保持OpenGL ES(2.0)不清除渲染表面(或错觉)?

1 个答案:

答案 0 :(得分:3)

OpenGL ES在方向更改期间不会破坏上下文或曲面。 View层次结构确实这样做了; GLSurfaceView特别喜欢释放它能找到的一切。

onSurfaceCreated()回调与SurfacesViews相关联。当方向发生变化时,您将浏览活动生命周期事件,该事件会拆除View,然后它们会拆除Surface。如果没有发生这种情况,并且你继续渲染到相同的Surface,那么你所做的一切似乎都会旋转90度。 (请记住,SurfaceView曲面会直接发送到系统合成器,而不是由应用程序与UI合成。)

通常的做法就是让一切都被拆除,然后重新建立起来。

如果由于某种原因这不起作用,我建议您在屏幕外进行渲染,然后将纹理blit到当前曲面。您可以在Grafika's“双重解码”活动中查看此示例,该活动会呈现为一对SurfaceTextures,它会连接(并重新连接)一对TextureViews。另一种做同样事情的方法是创建一个FBO,渲染到那个,并向你的SurfaceView进行blit(你可以在Grafika的“记录GL应用程序”活动中看到一个FBO setup / blit的例子)。 / p>