社区
Android
帖子详情
OPENGL纹理丢失的问题请教
CraneInForest
2010-10-09 05:47:49
先描述一下吧,我目前做的OPENGL游戏在按HOME键退回到主界面后,再进游戏,整个游戏就白屏了,调试后发现回到游戏时会再次调用onSurfaceCreated,于是我在这里面重新加载纹理资源就OK了~~但是RELOAD会使游戏卡上一段时间,不能立刻回到游戏,这样会造成用户体验不好~
我想问的是回到OPENGL界面的时候是不是必须重新RELOAD纹理资源?
但我看到有些OPENGL做的游戏返回的时候非常快,不像RELOAD了资源啊?
请教请教~
多谢指教!
...全文
677
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 欢迎交个朋友
针对这块 我也是无解状态
OpenGL
课程涵盖了
OpenGL
开发的方方面面,对开发中经常用到的开发知识点进行讲解,从实战的角度进行编码设计. 第1章-环境建立 第2章-基础图元 第3章-三维世界 第4章-
纹理
多彩世界 第5章-显存的分配-优化 第6章-场景控制 第7章...
Unity AssetBundle 资源(
纹理
,网格,动画,字体,LightMap,音频等)使用 优化
在优化Unity项目时,对资源的管理可谓是个系统纷繁的大工程。鉴于Unity独特又绝(cao)妙(dan)资源打包的AssetBundle管理机制,不同资源的属性适合于不同的存储和加载方式。...资源制作
纹理
\网格\材质\Shader...
关于Unity中的资源管理,你可能遇到这些
问题
AssetBundle资源制作
纹理
\网格\材质\Shader\音频\动画Lightmap 一、AssetBundle 相关 Q1:Unity中的SerializedFile是怎么产生的?请问用Unload(false)可以清除吗?因为读取了Bundle里面的...
关于Unity中的资源管理,你可能遇到这些
问题
(UWA报告)
资源制作
纹理
\网格\材质\Shader\音频\动画 Lightmap 一、AssetBundle 相关 Q1:Unity中的SerializedFile是怎么产生的?请问用Unload(false)可以清除吗?因为读取了Bundle里面的内容后已经赋值给其他物体了。而且...
UWA 技术分享连载 转载
Q1:Texture占用内存总是双倍,这个是我们自己的
问题
,还是Unity引擎的机制? Q2:我现在发现两个因素直接影响Overhead,一个是Shader的复杂度,一个是空Update方法及其同类空方法,不知道是否还有其他因素? Q3:...
Android
80,351
社区成员
91,288
社区内容
发帖
与我相关
我的任务
Android
移动平台 Android
复制链接
扫一扫
分享
社区描述
移动平台 Android
android
android-studio
androidx
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章