我们开发了一个Android的3D应用界面部汾使用Java,渲染部分使用了C++但发布后,应用在前后台切换时总是再渲染功能上出现错误导致程序崩溃经过几天的奋战,终于整清楚了
根据GLSurfaceView中的文档描述,渲染环境重建时会自动删除OpenGL的相关资源,因此不需要我们手动调用释放资源的动作
我们的应用要适应现有的情况,则必须:
1.在渲染环境删除前保存一些运行时资源
2.然后在渲染环境重建后,第一时间恢复这些运行时资源并把在前一个渲染环境中创建的OpenGL对象置为初始状态(只需要置状态,不需要调用OpenGL的删除资源函数
注意:一定不能调用删除函数,否则后续渲染就会出现未知的效果錯误比如花屏,贴图缺失等奇异错误)
对于恢复的时机比较容易找到那就是onSurfaceCreated,但保存运行资源的位置却没有明显的时机首先调用保存动作,必须在渲染环境环境删除前而且必须是在渲染线程中执行,我们初步确定了几个位置onPauseEGLWindowSurfaceFactory.destroySurface,EGLContextFactory.destroyContext,我们都试了,但居然不好使始终提示設备环境无效,经过一番努力终于搞定在onPause中调用,具体代码如下:
发布程序终于好用了!
有个小插曲,根据我的经验一般重建渲染环境需要重建窗口,但android在没有重建窗口的情况下居然也能重建渲染环境让我感到很诧异,后来查看ndk的程序
而我们在程序中保存了ANativeWindow对象的指针因此在程序从后台切换到前台时,也需要重新获取ANativeWindow指针否则会出错:
在我们程序中唯一使用ANativeWindow的地方就是取得窗口尺寸:
如果不重新獲取这个指针,w和h得到的都是负数我们的程序前端接的GLSurfaceView,从GLSurfaceView中无法获得ANativeWindow指针必须先在JAVA程序中
这个程序切到前台时也必须刷新ANativeWindow指针,才能取到正确的窗口尺寸
我们开发了一个Android的3D应用界面部汾使用Java,渲染部分使用了C++但发布后,应用在前后台切换时总是再渲染功能上出现错误导致程序崩溃经过几天的奋战,终于整清楚了
根据GLSurfaceView中的文档描述,渲染环境重建时会自动删除OpenGL的相关资源,因此不需要我们手动调用释放资源的动作
我们的应用要适应现有的情况,则必须:
1.在渲染环境删除前保存一些运行时资源
2.然后在渲染环境重建后,第一时间恢复这些运行时资源并把在前一个渲染环境中创建的OpenGL对象置为初始状态(只需要置状态,不需要调用OpenGL的删除资源函数
注意:一定不能调用删除函数,否则后续渲染就会出现未知的效果錯误比如花屏,贴图缺失等奇异错误)
对于恢复的时机比较容易找到那就是onSurfaceCreated,但保存运行资源的位置却没有明显的时机首先调用保存动作,必须在渲染环境环境删除前而且必须是在渲染线程中执行,我们初步确定了几个位置onPauseEGLWindowSurfaceFactory.destroySurface,EGLContextFactory.destroyContext,我们都试了,但居然不好使始终提示設备环境无效,经过一番努力终于搞定在onPause中调用,具体代码如下:
发布程序终于好用了!
有个小插曲,根据我的经验一般重建渲染环境需要重建窗口,但android在没有重建窗口的情况下居然也能重建渲染环境让我感到很诧异,后来查看ndk的程序
而我们在程序中保存了ANativeWindow对象的指针因此在程序从后台切换到前台时,也需要重新获取ANativeWindow指针否则会出错:
在我们程序中唯一使用ANativeWindow的地方就是取得窗口尺寸:
如果不重新獲取这个指针,w和h得到的都是负数我们的程序前端接的GLSurfaceView,从GLSurfaceView中无法获得ANativeWindow指针必须先在JAVA程序中
这个程序切到前台时也必须刷新ANativeWindow指针,才能取到正确的窗口尺寸
我们开发了一个Android的3D应用界面部汾使用Java,渲染部分使用了C++但发布后,应用在前后台切换时总是再渲染功能上出现错误导致程序崩溃经过几天的奋战,终于整清楚了
根据GLSurfaceView中的文档描述,渲染环境重建时会自动删除OpenGL的相关资源,因此不需要我们手动调用释放资源的动作
我们的应用要适应现有的情况,则必须:
1.在渲染环境删除前保存一些运行时资源
2.然后在渲染环境重建后,第一时间恢复这些运行时资源并把在前一个渲染环境中创建的OpenGL对象置为初始状态(只需要置状态,不需要调用OpenGL的删除资源函数
注意:一定不能调用删除函数,否则后续渲染就会出现未知的效果錯误比如花屏,贴图缺失等奇异错误)
对于恢复的时机比较容易找到那就是onSurfaceCreated,但保存运行资源的位置却没有明显的时机首先调用保存动作,必须在渲染环境环境删除前而且必须是在渲染线程中执行,我们初步确定了几个位置onPauseEGLWindowSurfaceFactory.destroySurface,EGLContextFactory.destroyContext,我们都试了,但居然不好使始终提示設备环境无效,经过一番努力终于搞定在onPause中调用,具体代码如下:
发布程序终于好用了!
有个小插曲,根据我的经验一般重建渲染环境需要重建窗口,但android在没有重建窗口的情况下居然也能重建渲染环境让我感到很诧异,后来查看ndk的程序
而我们在程序中保存了ANativeWindow对象的指针因此在程序从后台切换到前台时,也需要重新获取ANativeWindow指针否则会出错:
在我们程序中唯一使用ANativeWindow的地方就是取得窗口尺寸:
如果不重新獲取这个指针,w和h得到的都是负数我们的程序前端接的GLSurfaceView,从GLSurfaceView中无法获得ANativeWindow指针必须先在JAVA程序中
这个程序切到前台时也必须刷新ANativeWindow指针,才能取到正确的窗口尺寸
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。