加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

内存管理

发布时间:2020-12-14 17:02:12 所属栏目:百科 来源:网络整理
导读:内存管理是游戏开发中非常重要的内容,游戏的流畅性和响应及时性都和此有关,内存管理不好,游戏性能下降不说,还容易出现异常。 cocos2dx内存管理模拟oc的引用计数模式。现在内存管理技术主要分为两种:一是引用技术,一是垃圾回收。引用技术原理通过给每个
内存管理是游戏开发中非常重要的内容,游戏的流畅性和响应及时性都和此有关,内存管理不好,游戏性能下降不说,还容易出现异常。
cocos2dx内存管理模拟oc的引用计数模式。现在内存管理技术主要分为两种:一是引用技术,一是垃圾回收。引用技术原理通过给每个对象维护一个引用计数器,记录该对象被引用的次数。当计数器为0,表示该对象生命周期结束,自动触发对象的回收和释放。每个程序片段还必须负责的维护引用计数,繁琐的管理对象生命周期还必不可少。垃圾回收原理,它会自动跟踪每个对象,以便找到所有对象,回收不需要的引用。垃圾回收器是一个低级别的线程,指不定什么时候回收,不可控。
cocos2dx采用了引用计数和垃圾回收结合的机制,ccobject每个对象都有一个引用计数器,通过retainCount可以获取数值。构造创建时,引用计数加1,其他地方使用,调用retain方法加1,使用完成调用release方法减1,当引用计数器为0时,就会释放回收此对象。
对象创建后,调用autorelease方法,会添加到对象管理池PoolManager, CCPoolManager::getInstance()->addObject(this); 由回收池进行管理,PoolManager会在每次循环结束后调用pop()方法,pop()方法里会调用内存池中所有对象的release()方法,当引用计数器为0,对象就被释放回收。
Object *obj = new Object() ;// 计数器为 1
addChild(obj); //计数器为 2
obj->removeFromParent();// 1
只有再调用一次obj->release();方法,对象才能被回收;
现在使用自动管理器就可以解决这个问题
Object *obj = new Object() ;// 计数器为 1
obj->autorelease(); //2
游戏循环结束 //1
obj->removeFromParent();// 0,自动被回收

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读