先描述一下吧,我目前做的OPENGL游戏在按HOME键退回到主界面后,再进游戏,整个游戏就白屏了,调试后发现回到游戏时会再次调用onSurfaceCreated,于是我在这里面重新加载纹理资源就OK了~~但是RELOAD会使游戏卡上一段时间,不能立刻回到游戏,这样会造成用户体验不好~我想问的是回到OPENGL界面的时候是不是必须重新RELOAD纹理资源?但我看到有些OPENGL做的游戏返回的时候非常快,不像RELOAD了资源啊?请教请教~多谢指教!
调试欢乐多
仁兄想法是对的,但是针对opengl es没效果 ,
第一关于保存数据:进入stop状态这里保存相关数据 纹理无法保存,如果该纹理还是经过很长一段时间算出来的 更糟糕.......,意味着下次重新resume得消耗一段时间,
第二关于释放数据:opengl 无法让非主线线程(GL主线程)进行GL等操作也就以为着你想操作opengl es必须在onDrawFrame(),onSurfaceChanged(),onSurfaceCreated(),内释放纹理内存,当处于onstop状态估计这个线程就已经停止运行了吧......,所以释放内存比较麻烦
本人长期研究java以下的gles实现和GPU硬件加速,以上分析基于GLSurfaceView的工作原理。
只要你能保证不释放GL view,不重新设置GL Renderer,纹理数据是不会被释放掉的。
试试看吧。有好消息别忘给我散分-:)
你的意思问题就是怎样保证onSufaceCreated调用一次后不会再被调用第二次吧?而且本次GLReader生命周期结束应该是调用了surfaceDestroyed()这个函数吧,而且这个函数还是再onStop之前调用(意味着切换Activity就会调用这个函数),你怎样保证他不调用surfaceDestroyed()函数呢?
不过办法还是有的,GLRenderer是通过EGLContextFactory的createContext/destroyContext进行Context创建和释放。而同时GLSurfaceView还提供了另一个接口setEGLContextFactory,允许设置自己的EGLContextFactory。(记得要在SetRenderer之前调用)
这样就有机会在自己的EGLContextFactory上做点手脚,后面就不再细讲了