专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Android

OPENGL纹理丢失的有关问题请问

发布时间:2010-05-30 10:54:39 文章来源:www.iduyao.cn 采编人员:星星草
OPENGL纹理丢失的问题请教
先描述一下吧,我目前做的OPENGL游戏在按HOME键退回到主界面后,再进游戏,整个游戏就白屏了,调试后发现回到游戏时会再次调用onSurfaceCreated,于是我在这里面重新加载纹理资源就OK了~~但是RELOAD会使游戏卡上一段时间,不能立刻回到游戏,这样会造成用户体验不好~

我想问的是回到OPENGL界面的时候是不是必须重新RELOAD纹理资源?

但我看到有些OPENGL做的游戏返回的时候非常快,不像RELOAD了资源啊?

请教请教~

多谢指教!

------解决方案--------------------
仔细了解activity的生命周期 你切出去的时候调用的是onstop 可以在这里保存相关数据 切回来的时候是调用resume,可以在resume中重绘,不需要重新加载资源。重新加载资源很耗时间,但重绘却不耗时 可以考虑将资源写成静态的变量,ondestroy的时候释放即可 不过java是自动GC的,要是你有用到jni,则要在那里显式的调用析构
------解决方案--------------------
探讨

仔细了解activity的生命周期 你切出去的时候调用的是onstop 可以在这里保存相关数据 切回来的时候是调用resume,可以在resume中重绘,不需要重新加载资源。重新加载资源很耗时间,但重绘却不耗时 可以考虑将资源写成静态的变量,ondestroy的时候释放即可 不过java是自动GC的,要是你有用到jni,则要在那里显式的调用析构

------解决方案--------------------
onSurfaceCreated被调用意味着所有的GL context数据已全部被释放并重新被创建,onSurfaceCreated被调用的唯一可能,是你的程序重新设置了GL Renderer,也就是调用了GLSurfaceview的setRenderer。
本人长期研究java以下的gles实现和GPU硬件加速,以上分析基于GLSurfaceView的工作原理。
只要你能保证不释放GL view,不重新设置GL Renderer,纹理数据是不会被释放掉的。
试试看吧。有好消息别忘给我散分-:)
------解决方案--------------------
这样看来似乎有点麻烦,一旦stop,GLRenderer就会释放Context,所有的纹理数据也就不复存在。
不过办法还是有的,GLRenderer是通过EGLContextFactory的createContext/destroyContext进行Context创建和释放。而同时GLSurfaceView还提供了另一个接口setEGLContextFactory,允许设置自己的EGLContextFactory。(记得要在SetRenderer之前调用)
这样就有机会在自己的EGLContextFactory上做点手脚,后面就不再细讲了。。。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: