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的变 ...
随机推荐
- phonegap文件,目录操作以及网络上传,下载文件(含demo)
正在做一个跨平台的应用,需要使用phonegap进行文件的一些基本操作. 需求如下:可以选择本地图片,或者从相机选择图片,并进行显示在本地,然后上传到服务器,以及可以从服务器下载图片显示出来,如果本地 ...
- Angular(2)
1.自定义指令,直接栗子: note:定义指定是驼峰,2部分 前缀+作用,but 调用 改驼峰首字母大写处为 (-首字母小写) <!DOCTYPE html><html lang= ...
- 利用Manacher算法寻找字符串中的最长回文序列(palindrome)
寻找字符串中的最长回文序列和所有回文序列(正向和反向一样的序列,如aba,abba等)算是挺早以前提出的算法问题了,最近再刷Leetcode算法题的时候遇到了一个(题目),所以就顺便写下. 如果用正反 ...
- poj 2513 Colored Sticks trie树+欧拉图+并查集
点击打开链接 Colored Sticks Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 27955 Accepted ...
- C#中定义数组
C#定义数组 一.一维:int[] numbers = new int[]{1,2,3,4,5,6}; //不定长 int[] numbers = new int[3]{1,2,3};//定长 二 ...
- CentOS6.5下安装apache2.2和PHP 5.5.28
CentOS6.5下安装apache2.2 1. 准备程序 :httpd-2.2.27.tar.gz 下载地址:http://httpd.apache.org/download.cgi#apache2 ...
- FMDB最简单的教程-3 清空数据表并将自增字段清零
[db executeUpdate:@"DELETE FROM MemberInfo"]; [db executeUpdate:@"UPDATE sqlite_seque ...
- 移动设备页面高度不足时min-height 的尴尬处理
移动设备页面高度不足时min-height 的尴尬处理 在做html5的页面时,经常遇到页面内容太少撑不起来整个手机屏幕的高度. 我们经常使用min-height来处理,比如min-height:56 ...
- uva 10340 All in All
水题,从头到尾扫一遍就可以了,输入两个字符串s和t,判断是否可以从t中删除0个或多个字符(其他字符顺序不变),得到字符串s.例如,abcde可以得到bce,但无法得到dc. #include<a ...
- Maven实战(六)依赖
我们项目中用到的jar包可以通过依赖的方式引入,构建项目的时候从Maven仓库下载即可. 1. 依赖配置 依赖可以声明如下: <project> ... <dependenci ...