OPENGL纹理丢失的问题请教

CraneInForest 2010-10-09 05:47:49
先描述一下吧,我目前做的OPENGL游戏在按HOME键退回到主界面后,再进游戏,整个游戏就白屏了,调试后发现回到游戏时会再次调用onSurfaceCreated,于是我在这里面重新加载纹理资源就OK了~~但是RELOAD会使游戏卡上一段时间,不能立刻回到游戏,这样会造成用户体验不好~

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

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

请教请教~

多谢指教!
...全文
677 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xqhrs232 2011-06-09
  • 打赏
  • 举报
回复
也遇到这样的问题!!!莫名的纹理被贴了出来!
lxzhg 2010-10-15
  • 打赏
  • 举报
回复
我充分相信Google搞出来的东西,灵活性和扩展性是不需要担心的,唯一要做的就是深入研究一下,你会达到一个无所不能的境界。App开发貌似简单,想要精通着实不易~~~
lxzhg 2010-10-15
  • 打赏
  • 举报
回复
这样看来似乎有点麻烦,一旦stop,GLRenderer就会释放Context,所有的纹理数据也就不复存在。
不过办法还是有的,GLRenderer是通过EGLContextFactory的createContext/destroyContext进行Context创建和释放。而同时GLSurfaceView还提供了另一个接口setEGLContextFactory,允许设置自己的EGLContextFactory。(记得要在SetRenderer之前调用)
这样就有机会在自己的EGLContextFactory上做点手脚,后面就不再细讲了。。。
st50886160 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lxzhg 的回复:]

onSurfaceCreated被调用意味着所有的GL context数据已全部被释放并重新被创建,onSurfaceCreated被调用的唯一可能,是你的程序重新设置了GL Renderer,也就是调用了GLSurfaceview的setRenderer。
本人长期研究java以下的gles实现和GPU硬件加速,以上分析基于GLSurfaceView的工作原理。
只要你能保证不释放GL v……
[/Quote]

你的意思问题就是怎样保证onSufaceCreated调用一次后不会再被调用第二次吧?

而且本次GLReader生命周期结束应该是调用了surfaceDestroyed()这个函数吧,而且这个函数还是再onStop之前调用(意味着切换Activity就会调用这个函数),你怎样保证他不调用surfaceDestroyed()函数呢?
one2zero 2010-10-14
  • 打赏
  • 举报
回复
学习了
sniffer12345 2010-10-13
  • 打赏
  • 举报
回复
仔细了解activity的生命周期 你切出去的时候调用的是onstop 可以在这里保存相关数据 切回来的时候是调用resume,可以在resume中重绘,不需要重新加载资源。重新加载资源很耗时间,但重绘却不耗时 可以考虑将资源写成静态的变量,ondestroy的时候释放即可 不过java是自动GC的,要是你有用到jni,则要在那里显式的调用析构
st50886160 2010-10-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sniffer12345 的回复:]

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

仁兄想法是对的,但是针对opengl es没效果 ,
第一关于保存数据:进入stop状态这里保存相关数据 纹理无法保存,如果该纹理还是经过很长一段时间算出来的 更糟糕.......,意味着下次重新resume得消耗一段时间,
第二关于释放数据:opengl 无法让非主线线程(GL主线程)进行GL等操作也就以为着你想操作opengl es必须在onDrawFrame(),onSurfaceChanged(),onSurfaceCreated(),内释放纹理内存,当处于onstop状态估计这个线程就已经停止运行了吧......,所以释放内存比较麻烦
lxzhg 2010-10-13
  • 打赏
  • 举报
回复
onSurfaceCreated被调用意味着所有的GL context数据已全部被释放并重新被创建,onSurfaceCreated被调用的唯一可能,是你的程序重新设置了GL Renderer,也就是调用了GLSurfaceview的setRenderer。
本人长期研究java以下的gles实现和GPU硬件加速,以上分析基于GLSurfaceView的工作原理。
只要你能保证不释放GL view,不重新设置GL Renderer,纹理数据是不会被释放掉的。
试试看吧。有好消息别忘给我散分-:)
st50886160 2010-10-11
  • 打赏
  • 举报
回复
交个朋友 android在opengl 下 还不只有这点问题而已
你不想想这个时候你按Home 再次进入应用 纹理ID又从1开始 之前的纹理ID内存是否释放了?

我QQ:369092049 欢迎交个朋友

针对这块 我也是无解状态

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧