博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos2d-x3.2 内存管理
阅读量:6191 次
发布时间:2019-06-21

本文共 781 字,大约阅读时间需要 2 分钟。

  hot3.png

        图片缓存没去掉,这游戏里面普遍的问题。TextureCache::removeUnusedTextures这个方法只有在纹理计数为1的时候才会移除内存中缓存的Texture。这里有一个问题要先说一下:当我们创建一个精灵的时候,这张精灵所使用的Texture是会加载到内存中缓存着的。一旦你再次创建一个使用相同纹理的精灵,这个时候如果内存中还存在这张纹理的缓存,就会直接取出,而不用重新创建。当一个精灵创建的时候,在其内部调用addImage方法的时候,把引用计数做了+1处理,此时引用计数为2.当移除这个精灵的时候,引用计数会-1,这个时候引用计数为1。若此时你调用了TextureCache::removeUnusedTextures的方法。那这张纹理将从内存中移除。但是若是像之前说的,有两个精灵同时使用了这张问题,那该纹理的引用计数为3,必须两个精灵都移除后,才能释放内存。

        这边还有一点很重的是:只有在removeChild的时候,引用计数才会做-1处理,而cocos的removeChild是没有对其子节点进行remove处理的,也就是说,子节点中对于Texture的引用计数仍在,导致TextureCache::removeUnusedTextures的时候,纹理没办法有效的移除。

所以这里建议的方案是:

1.在移除一个节点之前,先遍历移除其子节点,释放引用计数

2.在层或者场景切换的时候,手动调用TextureCache::removeUnusedTextures方法

PS:在addChild的时候,会把对象放入容器中,而放入时会对其进行retain()的处理;在removeChild的时候,会把对象从容器中移除,会对其进行release()的处理

转载于:https://my.oschina.net/Jacedy/blog/351258

你可能感兴趣的文章
征服Perl——哈希——里程碑M7
查看>>
bgp属性分析--MED
查看>>
Postfix+Dovecot+LAMP+Extmail搭建web邮件系统(四)
查看>>
C#WinForm窗体之间的相互操作
查看>>
常用的SQL跟踪事件类
查看>>
生产环境MySQL 5.5.x单机多实例配置实践
查看>>
C#中异常的记录——log4net
查看>>
个人笔记:ORACLE大页内存hugepage和SGA、PGA的经验,SGA并不是越大越好
查看>>
软件测试工程师的角度看论证学问
查看>>
RHEL6入门系列之八,常用命令1
查看>>
Postfix+Dovecot+LAMP+Extmail搭建web邮件系统(三)
查看>>
Nagios+Cacti监控平台完美整合部署
查看>>
【我的技术我做主】浅谈linux中umask值及其对应的文件权限
查看>>
PHP获取浏览器型号,判断安卓还是IOS访问
查看>>
CentOS 5.5下升级OpenSSH-4.3p2到5.6p1
查看>>
Datax与hadoop2.x兼容部署与实际项目应用工作记录分享
查看>>
ipv6 6to4 tunnel测试
查看>>
轻松使用二进制安装Mysql5.6
查看>>
SQL Server中的Merge关键字
查看>>
用心做软件—细节决定成败
查看>>