社区
Android
帖子详情
OPENGL纹理丢失的问题请教
CraneInForest
2010-10-09 05:47:49
先描述一下吧,我目前做的OPENGL游戏在按HOME键退回到主界面后,再进游戏,整个游戏就白屏了,调试后发现回到游戏时会再次调用onSurfaceCreated,于是我在这里面重新加载纹理资源就OK了~~但是RELOAD会使游戏卡上一段时间,不能立刻回到游戏,这样会造成用户体验不好~
我想问的是回到OPENGL界面的时候是不是必须重新RELOAD纹理资源?
但我看到有些OPENGL做的游戏返回的时候非常快,不像RELOAD了资源啊?
请教请教~
多谢指教!
...全文
875
10
打赏
收藏
OPENGL纹理丢失的问题请教
先描述一下吧,我目前做的OPENGL游戏在按HOME键退回到主界面后,再进游戏,整个游戏就白屏了,调试后发现回到游戏时会再次调用onSurfaceCreated,于是我在这里面重新加载纹理资源就OK了~~但是RELOAD会使游戏卡上一段时间,不能立刻回到游戏,这样会造成用户体验不好~ 我想问的是回到OPENGL界面的时候是不是必须重新RELOAD纹理资源? 但我看到有些OPENGL做的游戏返回的时候非常快,不像RELOAD了资源啊? 请教请教~ 多谢指教!
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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 欢迎交个朋友
针对这块 我也是无解状态
Android下基于
OpenGL
的程序会发生
纹理
丢失
的原因
相关网帖 1。Workaround to losing the
OpenGL
context when Android pauses? http://gamedev.stackexchange.com/questions/12629/workaround-to-losing-the-
opengl
-context-when-android-pauses 2。P
android
纹理
存储,Android:
OpenGL
存储
纹理
多长时间?
openGL
存储
纹理
多长时间?离开活动时
纹理
内存是否会被回收?例如,如果我有以下代码:mGL.glGenTextures(1, mTextures, 0);mGL.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[0]); // A bound texture is// an active texture//mGL.glTexImage2D(GL10.GL_T...
MFC之CSplitter+
OpenGL
导致界面不刷新
在我第一个项目的时候之前没用到CSplitter分割窗体所以没有出现这个
问题
,但是随着需求的更改所以重新对第一版进行了修改,在引进了CSplitter控件分割窗体后对于
OpenGL
纹理
显示这部分就出现了刷新
纹理
后又被CSplitter刷掉了导致
纹理
显示后又被覆盖了,先来看看效果: CSplitter分割成左右两个窗口,程序起来的时候去加载一张图片然后使用
纹理
的...
MANAGED & UNMANAGED (DYNAMIC )TEXTURES IN LIBGDX (
OPENGL
CONTEXT LOSS)
原文链接http://www.badlogicgames.com/wordpress/?p=1073 文章意思大概:
opengl
> 1.keep an in-memory copy of the original bitmap used for the texture, apply all your draw calls to that bitmap and upload it to t
避坑指南:QGraphicsView与
OpenGL
混用时遇到的5个典型
问题
本文详细解析了在Qt开发中,QGraphicsView与
OpenGL
混用时常见的5个典型
问题
,包括视口更新模式兼容性、抗锯齿失效、
纹理
资源管理、性能优化及坐标系统转换。针对每个
问题
提供了实用的解决方案和代码示例,帮助开发者避免常见陷阱,提升图形渲染性能和应用稳定性。
Android
80,489
社区成员
91,375
社区内容
发帖
与我相关
我的任务
Android
移动平台 Android
复制链接
扫一扫
分享
社区描述
移动平台 Android
android
android-studio
androidx
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章