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 ...
随机推荐
- 【HDOJ】3553 Just a String
后缀数组加二分可解. /* 3553 */ #include <iostream> #include <sstream> #include <string> #in ...
- 函数buf_page_get
/**************************************************************//** NOTE! The following macros shoul ...
- codevs3731 寻找道路
方向dfs判定是否可行,spfa跑最短路. noip水题,wa好几次. #include<cstdio> #include<algorithm> #include<cst ...
- FJOI2007轮状病毒
不会推公式…… 不会基尔霍夫矩阵…… 不会matrix—tree定理…… 膜拜vfleaking大神…… 题解:http://z55250825.blog.163.com/blog/static/15 ...
- 在SQL Server实现最短路径的搜索
开始 这是去年的问题了,今天在整理邮件的时候才发现这个问题,感觉顶有意思的,特记录下来. 在表RelationGraph中,有三个字段(ID,Node,RelatedNode),其中Node和Rela ...
- liunx环境下安装mysql数据库
一:如果你的机器上之前安装有mysql数据库,先进行卸载 (1)需要先将它的文件删除 (2)同时注意删除老板本的etc/my.cnf文件和/etc/mysql目录,这两个文件控制的是mysql的一些配 ...
- jQuery基础知识— 获得内容和属性
jQuery拥有可操作HTML元素和属性的方法. 获得内容: text()--设置或返回所选元素的文本内容 html()--设置或返回所选元素的内容(包括HTML标记) val()--设置或返回表 ...
- 如何将域中的AD数据导入SharePoint
转:http://www.cnblogs.com/wallis0922/archive/2010/09/29/1838292.html 最近刚装好sharepoint2010,想要研究一下,第一件想做 ...
- (转载)HTTP URL
HTTP URL的格式如下: http://host[“:”post][abs_path] 其中http表示要通过HTTP协议来定位网络资源.host表示合法的Internet主机域名或IP地址(以点 ...
- xmlns 属性
xmlns 属性 xmlns 属性可以在文档中定义一个或多个可供选择的命名空间.该属性可以放置在文档内任何元素的开始标签中.该属性的值类似于 URL,它定义了一个命名空间,浏览器会将此命名空间用于该属 ...