【问题标题】:Prevent OpenGL ES from destroying canvas when orientation is switched防止 OpenGL ES 在方向切换时破坏画布
【发布时间】:2014-03-15 21:46:17
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我明白了。谢谢。所以你建议让它在方向改变时重新建立起来?我正在为某人做一个项目,他们希望动画不会在方向改变时被重置。他们希望它继续下去。我应该告诉他们重置它会更好吗?
    • 重置surface和重置animations是不同的事情。即使表面发生了变化,您的应用程序也可以从任何地方继续(请记住,由于方向变化,表面尺寸可能会有所不同)。例如,在 Android Breakout (code.google.com/p/android-breakout) 中,游戏状态独立于 GLSurfaceView(它积极地撕毁一切)。我添加了一个短暂的暂停让播放器进行调整,但不是必须的。
    • 所以我应该做动画并跟踪表面视图之外的位置,这样它就不会被重置?
    • 是的。仅使用 SurfaceView 子类进行渲染,将所有应用状态保存在不同的类中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 2023-03-27
    • 2018-11-30
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多