java - 防止 OpenGL ES 在方向切换时破坏 Canvas

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

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

最佳答案

OpenGL ES 在方向改变期间不会破坏上下文或表面。 View 层次结构确实执行此操作; GLSurfaceView 特别喜欢发布它能找到的所有内容。

onSurfaceCreated() 回调与 SurfacesViews 关联。当方向改变时,您会经历 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/

相关文章:

java.lang.NoSuchMethodError : okhttp3.internal.Platform.log 和线程 "Okhttp Dispatcher"java.lang.NoSuchFieldError:实例中的异常

java - HashMap 的 String 键在多长时被认为是不好的做法?

opengl - OpenGL/OpenGLES 中的帧缓冲区纹理行为

ios - CVOpenGLESTexture - 值得吗

在多部手机上进行 Android 测试?

android - 单骨骼(Matrix Palette)动画与零件的简单旋转/平移

java - 'az account list' 的 API 等效项是什么?

java - Spring Boot 和 Postgres : relation "sub_comment" does not exist

Android-DirectionalViewPager : NoClassDefFoundError: com. orientalviewpager.DirectionalViewPager$DataSetObserver

android - 如何在android中动态更新或更改imageview的图像?