cocos2d-x之内存管理(4)
c++的内存管理一直以来都是个问题,也有多种实现方案,比如智能指针,使用引用计数等,cocos2d-x也需要涉及到内存的管理。
cocos2d-x是如何管理内存的呢?
cocos2d-x的内存管理主要使用引用计数的机制进行内存的自动管理或者手动管理
常用的谁 new 了,谁delete 。这种方式很容易造成内存的碎片,严重的可能会造成内存的泄露,因为不是每个程序员都会记得在哪释放
cocos2d-x的内存管理分为手动内存管理和自动内存管理。在内存管理中,有一个很重要的类CCObject .
类CCObject实现了内存的管理机制。看源码,注释有解释
class CC_DLL CCObject : public CCCopying
{
public: //这两个是支持lua等脚本语言用的,可以先不用管
unsigned int m_uID;
int m_nLuaID;
protected:
unsigned int m_uReference; //对象的引用计数的
unsigned int m_uAutoReleaseCount;//自动内存管理的
public:
CCObject(void);
virtual ~CCObject(void);
void release(void); // 自减1 , m_uReference == 0时,delete this,销毁自己
void retain(void); // 自增1 , m_uReference++ ;
CCObject* autorelease(void); // 自动内存管理的。CCPoolManager::sharedPoolManager()->addObject(this);CCPoolManager是个内存池管理的
CCObject* copy(void); // CCObject的拷贝机制,内部就一句代码 return copyWithZone(0); ,可见,是调用了copyWithZone
bool isSingleReference(void) const; // 判断是不是单个引用
unsigned int retainCount(void) const; // 返回引用数
virtual bool isEqual(const CCObject* pObject); //判断两个对象是否是同一个对象 virtual void acceptVisitor(CCDataVisitor &visitor);
virtual void update(float dt) {CC_UNUSED_PARAM(dt);};
friend class CCAutoreleasePool; // 把CCAutoreleasePool设为CCObject的友元类,是为了方便CCAutoreleasePool访问CCObject中的成员进而进行内存管理
};
成员变量 m_uID 和 m_nLuaID 是关于支持lua脚本语言用的。暂时可以不用管
成员变量 m_uReference 为此类的一个实例引用的次数,初始化为 1 ,如果为0,则表明此实例没有被任何对象引用,则可以删除 , delete this
成员变量 m_uAutoReleaseCount 为此类的一个实例是否是自动释放内存的。初始化0,如果大于0,则表明是自动释放的。此前的cocos2d-x版本中,m_uAutoReleaseCount 是个bool类型的变量。 看下 CCObject 的类的实现代码:如下,有注释
CCObject::CCObject(void)
: m_nLuaID() // 支持lua脚本语言的,初始化为 0
, m_uReference() // 当创建一个CCObject对象时,引用计数加 1
, m_uAutoReleaseCount() // 自动释放内存的标识位, 等于0则表明不会自动释放,大于0表示对象会自动释放内存
{
static unsigned int uObjectCount = ; m_uID = ++uObjectCount;
} CCObject::~CCObject(void)
{
// 如果此对象已经具有自动释放内存机制,则把此对象从内存池中删除掉
if (m_uAutoReleaseCount > )
{
CCPoolManager::sharedPoolManager()->removeObject(this);//把此对象从内存池中删除掉
} //下面是支持lua脚本语言相关的
if (m_nLuaID)
{
CCScriptEngineManager::sharedManager()->getScriptEngine()->removeScriptObjectByCCObject(this);
}
else
{
CCScriptEngineProtocol* pEngine = CCScriptEngineManager::sharedManager()->getScriptEngine();
if (pEngine != NULL && pEngine->getScriptType() == kScriptTypeJavascript)
{
pEngine->removeScriptObjectByCCObject(this);
}
}
} CCObject* CCObject::copy()
{
//copy函数,直接调用copyWithZone,在这里没有用到
return copyWithZone();
} //释放内存
void CCObject::release(void)
{
CCAssert(m_uReference > , "reference count should greater than 0");
--m_uReference; //对象的引用计数减 1 if (m_uReference == )//如果引用计数为0,表明没有其它对象引用了,就删除对象,释放内存
{
delete this;
}
} void CCObject::retain(void)
{
CCAssert(m_uReference > , "reference count should greater than 0"); ++m_uReference; //如果引用一次,就要手动调用retain,把对象的引用加1
} CCObject* CCObject::autorelease(void)
{
//新创建的对象如果调用autorelease()函数,就把此对象加入到内存池管理器,此后就可以不再关心内存的释放了。
CCPoolManager::sharedPoolManager()->addObject(this);
return this;
} //判断对象是否只有一个引用
bool CCObject::isSingleReference(void) const
{
return m_uReference == ;
}
//返回引用的个数
unsigned int CCObject::retainCount(void) const
{
return m_uReference;
}
//判断两个对象是否相等
bool CCObject::isEqual(const CCObject *pObject)
{
return this == pObject;
} void CCObject::acceptVisitor(CCDataVisitor &visitor)
{
visitor.visitObject(this);
}
CCObject实现了内存的自动管理机制(autorelease())和内存释放(release())机制
接下来,介绍一下两个与内存管理相关的类 CCPoolManager和CCAutoreleasePool
cocos2d-x之内存管理(4)的更多相关文章
- cocos2d内存管理
设想如下场景, 这是一个典型的内存合理分配的场景: 在一帧内, 有若干个函数, 每个函数都会创建一系列的精灵, 每个精灵都不同, 都会占用一定的内存, 精灵的总数可能会有1000个, 而一个函数只会创 ...
- 【Cocos2d-x 3.x】内存管理机制与源码分析
侯捷先生说过这么一句话 : 源码之前,了无秘密. 要了解Cocos2d-x的内存管理机制,就得阅读源码. 接触Cocos2d-x时, Cocos2d-x的最新版本已经到了3.2的时代,在学习Coco ...
- cocos2d-x内存管理(见解)
cocos2d-x 延续了cocos2d 和OC的引用计数的内存管理机制! 下面我们来看看CCDriectro类 CCPoolManager::sharedPoolManager()->push ...
- Cocos2d-x内存管理研究<二>
http://hi.baidu.com/tzkt623/item/46a26805adf7e938a3332a04 上一篇我们讲了内核是如何将指针加入管理类进行管理.这次我将分析一下内核是如何自动 ...
- iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)
手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流 ...
- cocos2dx内存管理的一些看法
今年年初进入一家游戏公司,正式开始游戏引擎的学习,之前的ios学习,对现在的游戏引擎学习还是有很大的帮助的,虽然使用c++,但却能时刻感受到ios框架对于cocos2dx的巨大影响. 由于之前一直使用 ...
- Cocos2D-X2.2.3学习笔记3(内存管理)
本章节介绍例如以下: 1.C/C++内存管理机制 2.引用计数机制 3.自己主动释放机制 1.C/C++内存管理机制 相信仅仅要懂oop的都知道NEW这个keyword吧,这个通俗点说事实上就是创建对 ...
- cocos2dx内存管理
cocos2dx基于引用计数管理内存,所有继承自CCObject的对象都将获得引用计数的能力,可通过调用retain成员函数用于引用计数值,调用release减少引用计数值,当计数值减为0时销毁对象. ...
- [置顶] 【玩转cocos2d-x之二十】从CCObject看cocos2d-x的内存管理机制
原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/13765639 再看CCObject,剔除上节的拷贝相关,以及Lua脚本相关的 ...
- cocos2d-x游戏引擎核心之二——内存管理
(一) cocos2d-x 内存管理 cocos2d里面管理内存采用了引用计数的方式,具体来说就是CCObject里面有个成员变量m_uReference(计数); 1, m_uReference的变 ...
随机推荐
- python 简单爬虫diy
简单爬虫直接diy, 复杂的用scrapy import urllib2 import re from bs4 import BeautifulSoap req = urllib2.Request(u ...
- List集合中的对象根据属性排序
集合类List存放的数据,默认是按照放入时的顺序存放的,比如依次放入A.B.C,则取得时候,则也是A.B.C的顺序,实际场景中,有时我们需要根据自定义的规则对List中的元素进行排序,该如何实现呢?看 ...
- protoc 命令参数
protoc 命令的获得 源码在 https://github.com/google/protobuf , 如果不想自己编译获得最新版本,则可以下载官方编译好的各个平台的,下载地址:https://g ...
- Thinkpad 笔记本VMware Workstation 安装虚拟机出现“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”解决方法
今天在使用VMware打算在机器中安装新的虚拟机时,出现"此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态"错误如下: 提示信息: 已将该虚拟机配 ...
- python笔记一
好奇,想一探究竟.安装就出点小问题,win7,64位,一直卡在这里不动了? 只好取消.第二天安装仍是如此. 于是下载Windows6.1-KB2999226-x64.msu,安装,仍卡顿不动: 于是找 ...
- 文章“Redcing the Dimensiongality of Data with Neural Networks”的翻译
注明:本人英语水平有限,翻译不当之处,请以英文原版为准,不喜勿喷,另,本文翻译只限于学术交流,不涉及任何版权问题,若有不当侵权或其他任何除学术交流之外的问题,请留言本人,本人立刻删除,谢谢!! 本文原 ...
- TJI读书笔记12-接口
TJI读书笔记12-接口 抽象类和抽象方法 接口 完全解耦和策略模式 接口间的继承关系 工厂模式 乱七八糟不知道怎么归类的知识点 接口和抽象类为我们提供了更强又有力的接口和实现分离的方法. 抽象类和抽 ...
- C#获取操作系统是32位或64位的代码
注意需添加引用System.Management) public static string Distinguish64or32System() { try { string addressWidth ...
- Oracle 11g AWR和ADDM性能报告
一.自动工作负载库(Automatic Workload Repository,AWR) 自动工作负载库(Automatic Workload Repository,AWR)是在Oracle公司提供的 ...
- 更改appstore开发商名字
个人账号,名字要改,google了半天也没找出解决方案,最后发邮件求助水果,发来解决办法. 您好: 感谢您参与 Apple 开发者计划.我是 Daniel , 非常荣幸能就更改 iTunes Conn ...