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

Java 防止OpenGL ES在方向切换时破坏画布,java,android,opengl-es,opengl-es-2.0,surfaceview,Java,Android,Opengl Es,Opengl Es 2.0,Surfaceview,据我所知,当Android设备的方向改变时,OpenGL ES会破坏onSurfaceCreated()和类似的方法并重新启动它们。换句话说,当方向改变时,一切都会像刚开始一样重置,因为就opengl es而言,它确实如此。我遇到的问题是我不希望它将渲染表面擦拭干净。我希望它继续下去,只在风景中。重申:所有矩阵和对象位置保持不变,只是现在方向不同。我不知道该怎么办。我想可能会保留旋转前的最后一个状态,然后将其应用到新的渲染曲面上-这是一个很好的解决方法吗?因此,我想我的问题是:当屏幕方向切换时,

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

OpenGL ES在方向更改期间不会破坏上下文或表面。
视图
层次结构就是这样做的
GLSurfaceView
特别喜欢发布它能找到的所有东西

onSurfaceCreated()
回调与
曲面
视图
关联。当方向发生变化时,您将经历活动生命周期事件,这些事件会拆下
视图
,然后依次拆下
表面
。如果没有发生这种情况,并且您继续渲染到相同的
曲面
,那么您所做的一切看起来都会旋转90度。(请记住,
SurfaceView
曲面直接发送到系统合成器,而不是由应用程序与UI合成。)

通常的做法是让一切都被拆掉,然后再重新建造


如果由于某种原因这不起作用,我建议您在屏幕外进行渲染,然后将纹理blit到当前曲面。您可以在“双重解码”活动中看到这方面的一个示例,该活动将呈现为一对
表面纹理
,并将其连接(并重新连接)到一对
纹理视图
。做同样事情的另一种方法是创建一个FBO,渲染成FBO,然后将其blit到您的
SurfaceView
(您可以在Grafika的“Record GL app”活动中看到FBO设置/blit的示例)。

我明白了。谢谢。所以你建议让它在方向改变后重新建立起来?我正在为某人做一个项目,他们希望动画不会在方向改变时重置。他们希望它继续下去。我是不是应该告诉他们最好让它复位?让曲面复位和让动画复位是两码事。即使曲面发生了变化,你的应用程序也可以从它所在的位置继续运行(请记住,由于方向的变化,曲面的尺寸可能会在以后有所不同)。例如,在Android Breakout()中,游戏状态独立于
GLSurfaceView
(它会破坏一切)。我添加了一个短暂的暂停,让玩家进行调整,但不一定要有一个。所以我应该做动画并跟踪曲面视图之外的位置,这样它就不会被重置?是的。使用SurfaceView子类仅用于渲染,将所有应用程序状态保留在不同的类中。