cocos2d-x 添加纹理自动回收机制
转自:http://www.cnblogs.com/lancidie/archive/2013/04/13/3019375.html
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 < ) {
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 == -) {
reloadTexture();
} m_lastUpdateTime = TimeGet();
#endif
return m_uName;
}
cocos2d-x 添加纹理自动回收机制的更多相关文章
- zabbix添加邮件报警机制
zabbix添加邮件报警机制 作者:尹正杰 还记得之前跟大家聊过的一个如何监控一个目录的话题吗?我们虽然监控出来数据了,也有数据了,但是,只是监控也没有用啊~因为我们不能24小时盯着屏幕然后 出了事情 ...
- atitit.提升稳定性---hibernate 添加重试retry 机制解决数据库连接关闭
atitit.提升稳定性---hibernate 添加重试retry 机制解决数据库连接关闭 1. 流程总结 retry(5times).invoke(xxx).test().rest().$() t ...
- Cocos2D中的纹理(textures)的解释
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- 给Cocos2D视图添加手势支持
见如下代码: UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc]initWithTarget:self ac ...
- Java -- 深入浅出GC自动回收机制
1,去年开春去美团和58同城面试的时候第一个问题基本上都是来说说 Java GC机制,当时年轻的我也很耿直,直接说不会,现在想想还是当时年轻啊.刚好这段时间被各大论坛的面试题刷屏,见到最多的也是也是这 ...
- Web中线程与IIS线程池自动回收机制
开发Web项目后,部署到 IIS上 ,运行一直稳定,当Web程序中加入了定时任务,或者线程之类的机制后,第二天发现悲催了,定时任务并没有执行,此时重新登录一下网站,定时任务又重新执行.原来IIS默认有 ...
- 略坑的C#自动回收机制
说起这个坑货,要说说折腾了好久的bug,项目对方需要在32位系统上使用,C#加载图像扔给C++处理再返回.所以想好了,C#这边加载图像开好内存扔给C++,各自开的内存各自释放. 所以,在32位系统上出 ...
- osg添加纹理示例
转自http://www.cnblogs.com/ylwn817/articles/1976851.html #include <osgDB/ReadFile>#include <o ...
- Cocos2D中的纹理大小计算
纹理占用的内存大小是纹理尺寸乘以颜色深度. 图片文件的大小一般很小.一个初学者常见的错误是假设纹理内存使用量和图片大小一致. 哎,纹理内存(对于非压缩格式)的大小可以用以下伪代码来计算: pixelW ...
随机推荐
- JavaScript DOM高级程序设计 5动态修改样式和层叠样式表1(源代码)--我要坚持到底!
W3C DOM2样式规范 现在这边贴出本章要的源代码,注意要结合前面用到的ADS库http://vdisk.weibo.com/s/Dq8NU CSSStyleSheet对象属性: type :始终是 ...
- Git教程(1)官网及官方中文教程
1,Git官网 http://www.git-scm.com/ 2,官方中文教程 http://git-scm.com/book/zh/v2
- mysql 幻读
幻读(Phantom Read) 是指当用户读取某一范围的数据行时,B事务在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影”行.InnoDB和Falcon存储引擎通 过多版本并发 ...
- 存储过程 分页【NOT IN】和【>】效率大PK 千万级别数据测试结果
use TTgoif exists (select * from sysobjects where name='Tonge')drop table Tongecreate table Tonge( I ...
- 剑指Offer:找出数组中出现次数超过一半的元素
题目:找出数组中出现次数超过一半的元素 解法:每次删除数组中两个不同的元素,删除后,要查找的那个元素的个数仍然超过删除后的元素总数的一半 #include <stdio.h> int ha ...
- (十二)学习CSS之box-sizing 属性
参考:http://www.w3school.com.cn/cssref/pr_box-sizing.asp CSS3 box-sizing 属性 定义和用法 box-sizing 属性允许您以特定的 ...
- ZOJ 2283 Challenge of Wisdom
题意:在一个n * m的地图里,有p个宝藏,每次只能向横纵坐标增加的方向走,问最少走几次能把宝藏都拿走. 解法:按横坐标排序,纵坐标的一个不下降子序列就是一条合法路径,要求多少条不下降子序列可以覆盖所 ...
- HDU 5701 中位数计数 暴力
老题了,附上黄学长链接一发,直接改改就AC了,http://hzwer.com/1216.html #include <cstdio> #include <iostream> ...
- Install minidwep-gtk
Hi to everyone in this time i'm going to show you how to install minidwep-gtk to test your own wifi ...
- PDF/WORD/EXCEL 图片预览
一.PDF/WORD/EXCEL 转 XPS 转 第一页内容 转 图片 WORD.EXCEL转XPS (Office2010) public bool WordToXPS(string sourceP ...