cocos2d-x 3.0 内存管理机制
***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************
再来一弹,内存管理机制
1.简言机制
2.代码观机制
1.简言-Cocos2d-x的内存管理机制
说到内存管理,这是个question,(⊙v⊙)嗯。。
看一下各语言怎么进行内存管理吧?
——JAVA:
堆区的就是new来分配内存。通过垃圾回收机制来回收。
(详细的非常复杂,能够看看这个文章 -> http://blog.csdn.net/tutngfei1129287460/article/details/7383480
)
——C++:
new来创建,delete来删除
——Objective-C:
採用引用计数的方法
新建一个Obj,每一个Obj都有一个retainCount。
在new、alloc、retain的时候,都会让这个retainCount+1。
若对这个对象,进行release操作,则会让retainCount-1。
所以。每一个对象都有两个方法:retain和release。
当retainCount为0时,这个对象就被释放了。
而Cocos2d-x 使用C++实现了Objective-C的管理机制。
2.代码观-cocos2d-x的内存管理机制
创建一个对象,来看看一看这个管理机制。
打开项目,在入口程序AppDelegate.cpp中能够看到:
// create a scene. it's an autorelease object
auto scene = HelloWorld::createScene(); // run
director->runWithScene(scene);
创建了一个场景。并执行。跟踪进去。创建场景的函数:
// 'scene' is an autorelease object
auto scene = Scene::create(); // 'layer' is an autorelease object
auto layer = HelloWorld::create();
在createScene函数中。进行了场景的创建和图层的创建。
都用的是create方法。不管是scene还是layer,它们都是属于node子类。相同node也是ref的子类。
之前说过,Ref类就是cocos2d-x的内存管理机制。
跟踪到,Ref类,能够发现:
<span style="font-size:14px;">class CC_DLL Ref
{
public:
/**
* Retains the ownership.
*
* This increases the Ref's reference count.
*
* @see release, autorelease
* @js NA
*/
void retain(); /**
* Release the ownership immediately.
*
* This decrements the Ref's reference count.
*
* If the reference count reaches 0 after the descrement, this Ref is
* destructed.
*
* @see retain, autorelease
* @js NA
*/
void release(); /**
* Release the ownership sometime soon automatically.
*
* This descrements the Ref's reference count at the end of current
* autorelease pool block.
*
* If the reference count reaches 0 after the descrement, this Ref is
* destructed.
*
* @returns The Ref itself.
*
* @see AutoreleasePool, retain, release
* @js NA
* @lua NA
*/
Ref* autorelease(); /**
* Returns the Ref's current reference count.
*
* @returns The Ref's reference count.
* @js NA
*/
unsigned int getReferenceCount() const; protected:
/**
* Constructor
*
* The Ref's reference count is 1 after construction.
* @js NA
*/
Ref(); public:
/**
* @js NA
* @lua NA
*/
virtual ~Ref(); protected:
/// count of references
unsigned int _referenceCount; friend class AutoreleasePool; #if CC_ENABLE_SCRIPT_BINDING
public:
/// object id, ScriptSupport need public _ID
unsigned int _ID;
/// Lua reference id
int _luaID;
#endif
};
</span>
。。。。。 好长
里面有:
retain方法(添加引用),
release方法(降低引用),
autorelease方法(实现自己主动释放)
getReferenceCount方法(获得引用计数)
Ref(),~Ref() 构造函数和析构函数
_referenceCount
这个就是引用值
AutoreleasePaul
友元类
_ID,_luaID
对JS和Lua脚本的支持
再看一下,这个类的详细定义,
能够在项目目录内的:cocos2d/cocos/base/找到Ref类
也能够在,VS2012打开后。外部依赖项里找Ref类,但找到的都是.h头文件。我们要看的.cpp哟
可是,这个类找的时候,叫CCRef
——在,Ref构造函数能够看到:
Ref::Ref()
: _referenceCount(1) // when the Ref is created, the reference count of it is 1
也就是说,每当创建一个对象,它的引用值初始化为1。
——当,运行retain方法
void Ref::retain()
{
CCASSERT(_referenceCount > 0, "reference count should greater than 0");
++_referenceCount;
}
会对引用值++
——当,运行release方法
void Ref::release()
{
CCASSERT(_referenceCount > 0, "reference count should greater than 0");
--_referenceCount;
会对引用值--
——且,release后,要进行是否为0的推断,若为0,则delete this:
if (_referenceCount == 0)
{
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
auto poolManager = PoolManager::getInstance();
if (!poolManager->getCurrentPool()->isClearing() && poolManager->isObjectInPools(this))
{
CCASSERT(false, "The reference shouldn't be 0 because it is still in autorelease pool.");
}
#endif
delete this;
}
从此可见,cocos2d-x是通过引用计数来控制对象的生命周期。
因此。cocos2d-x编程时。基本不用delete语句,仅仅有在非Ref基类的类或者Ref类内才会用delete语句。
再回过头,看一下Scene的create方法:
Scene *Scene::create()
{
Scene *ret = new Scene();
if (ret && ret->init())
{
ret->autorelease();
return ret;
}
else
{
CC_SAFE_DELETE(ret);
return nullptr;
}
}
在这里面,我们先新建场景,然后运行场景初始化方法(init)。然后把当前对象加入到自己主动释放池管理,
这种方法定义:
Ref* Ref::autorelease()
{
PoolManager::getInstance()->getCurrentPool()->addObject(this);
return this;
}
这样一来,我们就不须要自己明白的编码。并且当对象被引用,自己主动进行release方法。
——end
恩,就到这里了,本来想用实例来执行一下,可出了些问题。
明天就要走了。有段时间不能上了。唉。。
參考资料:
***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************
cocos2d-x 3.0 内存管理机制的更多相关文章
- 【Cocos2d-x 3.x】内存管理机制与源码分析
侯捷先生说过这么一句话 : 源码之前,了无秘密. 要了解Cocos2d-x的内存管理机制,就得阅读源码. 接触Cocos2d-x时, Cocos2d-x的最新版本已经到了3.2的时代,在学习Coco ...
- 深入了解C#系列:谈谈C#中垃圾回收与内存管理机制
今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个<WCF分布式开发必备知识>系列后的一次休息吧.以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会 ...
- Spark 1.6以后的内存管理机制
Spark 内部管理机制 Spark的内存管理自从1.6开始改变.老的内存管理实现自自staticMemoryManager类,然而现在它被称之为"legacy". " ...
- python的内存管理机制
先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计数 (3)内存池机制 一.垃圾回收: python不像C++,Java等语言一样,他们可以不用事先声明变量 ...
- 了解linux内存管理机制(转)
今天了解了下linux内存管理机制,在这里记录下,原文在这里http://ixdba.blog.51cto.com/2895551/541355 根据自己的理解画了张图: 下面是转载的内容: 一 物理 ...
- cocos2dx的内存管理机制
首先我们必须说一下c++中变量的内存空间的分配问题,我们在c++中写一个类,可以在栈上分配内存空间也可以使用new在堆上分配内存空间,如果类对象是在栈上分配的内存空间,这个内存空间的管理就不是我们的事 ...
- 12.Object-C--浅谈OC的内存管理机制
昨天学习了OC的内存管理机制,今天想总结一下,所以接下来我要在这里bibi一下:OC的内存管理. 首先我要说的是,内存管理的作用范围. 内存管理的作用范围: 任何继承了NSObject的对象,对其他基 ...
- Android内存管理机制之一:low memory killer
转载自http://www.miui.com/thread-29268-1-1.html 准备写这个专题之前,心里是有点忐忑的.首先Android内存管理机制相当复杂,想要讲清楚比较困难:其次对于绝大 ...
- OC 内存管理机制总结
OC 内存管理机制总结 一:OC内存管理机制目前分为两块,其一自动内存管理机制,其二手动内存管理机制: 1.首先我们从自动内存管理机制讲起: 1)什么是自动内存管理机制,自动内存管理机制就是程序中所创 ...
随机推荐
- MOS管使PIC单片机不能正常运行
程序: #include "led.h" void InitLed(void) { TRISB &= ~0x70; ANSELB &= ~0x70; } void ...
- windows通过NSF挂载centos目录
windows通过NSF挂载centos目录 来源: http://blog.csdn.net/u012955038/article/details/77151346 CentOS 配置 1.安装NF ...
- [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划
[luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划 试题描述 一个餐厅在相继的 \(N\) 天里,第 \(i\) 天需要 \(R_i\) 块餐巾 \((i=l,2,-,N)\) ...
- 【CF1068D】Array Without Local Maximums(计数DP)
题意: n<=1e5 思路:卡内存 dp[i][j][k]表示当前第i个数字为j,第i-1个数字与第i个之间大小关系为k的方案数(a[i-1]<a[i],=,>) 转移时使用前缀和和 ...
- Array拼接字符串
原文发布时间为:2011-01-12 -- 来源于本人的百度文章 [由搬家工具导入] Array拼接字符串本来就是一种投机取巧的无聊玩意,来源是IE6对字符串的+实现错误一般情况下,如果是语义性的字符 ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---3
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: <Linux命令行与shell脚本 ...
- [SaltStack] Crontab部署
salt.states.cron 接着早上安静的时间, 在这里梳理下crontab相关的东东, 主要是crontab的统一管理维护, 包括新增, 修改, 下线等等. 下面就详细看下crontab的sl ...
- LeetCode OJ-- Edit Distance **
https://oj.leetcode.com/problems/edit-distance/ 动态规划,它的小规模问题是:当 word1 word2都比较小的时候,word1变成 word2需要的 ...
- 前端js、jQuery实现日期格式化、字符串格式化
1. js仿后台的字符串的StringFormat方法 在做前端页面时候,经常会对字符串进行拼接处理,但是直接使用字符串拼接,不但影响阅读,而且影响执行效率,且jQuery有没有定义字符串的Strin ...
- 不一样视角的Glide剖析
推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) Glide是一个快速高效的Android图片加载库,注重于平滑的 ...