cocos2d-x添加纹理自动回收机制
来源:互联网 发布:多重曝光软件 编辑:程序博客网 时间:2024/05/06 01:04
1、不是一个完整的模块,所以不提供完整代码,只提供思路和核心代码。 思路很简单,给每个纹理维护一个生命周期和上次渲染时间,每次渲染的时候更新这个渲染时间,CCTextureCache中每隔一定时间(15秒)遍历一下当前纹理集合,如果发现有纹理超过生命周期指定时间没有渲染,则释放此纹理。 CCTexture2D中的getName函数就是很好的更新渲染时间以及释放纹理重新加载的入口。 因为CCTexture2D要提供重新加载图片的机制,所以最好提供一个initWithFile的接口,同时不要忘记记录一些OpenGL的特殊标志,重新加载纹理的时候要再对纹理设置这些标志,比如glTexParameteri的调用。
2、不是很高级的牛x方案,mmo会比较实用,很多游戏引擎都有提供类似甚至更高级的特性,小游戏没有必要(因为总共就那么一点点资源,全加载到内存中也不会有多少消耗)
3、好处是根据使用纹理的状况自动释放不渲染的纹理,并且需要使用的时候再次加载此纹理。 这样可以节约内存,并且省去外部维护纹理生命周期的操作。
注意,单纯的释放CCSprite并不会释放到纹理数据,它依然存在于内存中。要在合适的时机手动调用 CCTextureCache::removeUnusedTextures 来释放没有在使用的纹理。 或者调用 CCTextureCache::removeTextureForKey 来释放指定纹理。 对一个mmo来说,这很有可能变成一个繁琐的操作,甚至进化成一个陷阱。(比如在某一个场景释放了指定的纹理,但是另外一个地方又使用到它,例如CCSpriteFrameCache中)。
通过一个自动的“垃圾回收”,外部程序员可以不关注纹理的生命周期,一些界面忘记释放也不会产生太大的问题,因为当纹理已经被释放了,剩下的CCSprite本身并不占内存,CCSpriteFrame也是。
4、副作用是,可能因图片的加载造成瞬卡。 这个需要代码中逻辑控制。比如某些希望常驻内存的图片设置为不垃圾回收。
5、因为4提到的副作用,所以图片打包的时候并不是越大越好。反而会倾向于比较小的图片,比如128*128或者是256*256。这样可以保证加载速度。并且是用到哪个图片加载哪个也可以避免无意义的重复加载操作。
代码非常简单:
- void CCTextureCache::processTextureCache()
- {
- if (TimeGet() - m_lastCheckTime < 2000) {
- return;
- }
- m_lastCheckTime = TimeGet();
- uint32 currentTime = TimeGet();
- CCDictElement* pElement = NULL;
- CCDICT_FOREACH(m_pTextures, pElement)
- {
- CCTexture2D * pTexture = (CCTexture2D*)pElement->getObject();
- if (pTexture && pTexture->isAutoGC() && currentTime - pTexture->getLastUpdateTime() > pTexture->getLiveTime())
- {
- pTexture->releaseTexture();
- }
- }
- }
- GLuint CCTexture2D::getName()
- {
- #if CC_ENABLE_TEXTURE_AUTO_GC
- if (m_uName == -1) {
- reloadTexture();
- }
- m_lastUpdateTime = TimeGet();
- #endif
- cocos2d-x添加纹理自动回收机制
- cocos2d-x添加纹理自动回收机制
- cocos2d-x 垃圾自动回收机制浅析
- cocos2d-x 内存回收机制
- cocos2d-x 内存回收机制
- cocos2d-x 纹理研究
- Cocos2d-x 纹理管理
- Cocos2d-x 纹理优化
- cocos2d 纹理加载机制
- cocos2d-x初探学习笔记(13)--内存回收机制
- cocos2d-x初探学习笔记(13)--内存回收机制
- cocos2d-x 纹理像素格式
- cocos2d-x 3.0纹理缓存
- cocos2d 3.x 纹理缓存
- Cocos2d-X的纹理(2)
- Cocos2d-X的纹理(1)
- cocos2d-x 纹理优化选择
- cocos2d-x lua 内存回收
- 内部类
- js数组的差集
- Xcode运行时错误汇总
- cocos2d-x android平台切入后台纹理失效的解决方法
- 人月神话书评
- cocos2d-x添加纹理自动回收机制
- 多态
- 第26讲 对话框AlertDialog的自定义实现
- windows下如何检测文件名大小写不匹配
- USB EHCI和OHCI端口切换原理分析
- hdu 4773 Problem of Apollonius
- 关于WM_NCHITTEST消息
- 第27讲 UI组件之 ScrollView与底部动态添加数据
- 多态2