原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://4137613.blog.51cto.com/4127613/784134
一、概述
cocos2d-x最初移植自cocos2d的objective C版本。因此,在内存管理上,使用了和NSObject类似的引用计数器方法,相关接口放置在CCObject类中。
二、引用计数器——手动管理内存
CCObject的及其子类的对象在创建时,引用计数自动设置为1。之后每次调用retain,引用计数+1。每次调用release,引用计数-1;若引用计数=0,则直接delete this。
相关接口如下:
//引用次数+1 virtual void CCObject::retain(void); //引用次数-1;若引用计数器=0,则delete this; virtual void CCObject::release(void); //helper方法,快速判断当前对象只有唯一引用 bool CCObject::isSingleRefrence(void); //返回引用次数 unsigned int CCObject::retainCount(void);
原则1:谁生成(new、copy)谁负责release。
例子:
CCObject *obj=new CCObject; ... obj->release();
retain是在指针传递和赋值时使用的,他的含义是表示拥有。这经常用在指针赋值上。
原则2:谁retain,谁负责release。
例子:
obj->retain(); ... obj->release();
原则3:传递赋值时,需要先retain形参,后release原指针,最后赋值。(注意,因为这里没有使用自赋值检查,所以这组顺序不能错。)
例子:
void CCNode::setGrid(CCGridBase* pGrid) { CC_SAFE_RETAIN(pGrid); CC_SAFE_RELEASE(m_pGrid); m_pGrid = pGrid; }
三、自动释放池——自动管理内存
原则4:对于使用autorelease的对象,不必管它,每帧结束后会自动释放。
CCObject* CCObject::autorelease(void);
例子:
CCObject *obj=new CCOjbect; obj->autorelease(); ...
完全手动管理内存,很繁琐,cocos2d-x提供了自动释放池CCPoolManager。将对象置于自动释放池中,每帧绘制结束,就自动release池中的对象。
四、CCNode节点管理
cocos2d-x使用节点组成一棵树,渲染的时候要遍历这棵树。CCNode是所有节点类的父类,他内部使用了一个CCArray对象管理他的所有子节点,当对象被添加为子节点时,实际上是被添加到CCArray对象中,同时会调用这个对象的retain方法。同理,从CCArray中移除时,也会调用release方法。
相关接口:
virtual void addChild(CCNode * child); virtual void addChild(CCNode * child, int zOrder); virtual void addChild(CCNode * child, int zOrder, int tag); virtual void removeChild(CCNode* child, bool cleanup); void removeChildByTag(int tag, bool cleanup); virtual void removeAllChildrenWithCleanup(bool cleanup);
在切换场景时,系统会遍历整棵树的节点,进行release。
五、静态工厂
cocos2d-x中存在大量的静态工厂方法,这些方法中,全都对this指针调用了autorelease函数。如CCSprite中的这些方法:
static CCSprite* spriteWithTexture(CCTexture2D *pTexture); static CCSprite* spriteWithTexture(CCTexture2D *pTexture, const CCRect& rect); static CCSprite* spriteWithTexture(CCTexture2D *pTexture, const CCRect& rect, const CCPoint& offset); static CCSprite* spriteWithSpriteFrame(CCSpriteFrame *pSpriteFrame); static CCSprite* spriteWithSpriteFrameName(const char *pszSpriteFrameName); static CCSprite* spriteWithFile(const char *pszFileName); static CCSprite* spriteWithFile(const char *pszFileName, const CCRect& rect); static CCSprite* spriteWithBatchNode(CCSpriteBatchNode *batchNode, const CCRect& rect);
这些方法内部实现了:内存分配、初始化、设置autorelease。用静态工厂来生成对象,可以简化代码,是官方建议的方法。
六、cache机制类
cocos2d-x中存在一些cache类,这些都是单例类的管理器。
这些cache内部也使用了ratain和release方法,防止这些资源被释放掉。
使用这些cache,我们可以保存预加载的一些资源,在方便的时候调用它,去绑定给一些对象。注意,这些cache在场景切换时,不会自动删除,需要手动调用purgeXXXX方法,进行清理。
相关推荐
以下是对Java内存管理的精彩概述,主要基于Sun Hotspot JVM,但请注意,不同JVM可能有不同的实现方式。 1. **Java对象在内存中的存储** Java对象在内存中的分配主要发生在堆上,这是所有类实例和数组的内存来源。...
### C语言内存管理:深入剖析内存泄漏及其防治策略 #### C语言概述 C语言作为一种通用且高效的编程语言,自20世纪70年代由丹尼斯·里奇在贝尔实验室开发以来,便因其强大的特性和广泛的适用性而在软件开发领域占据...
#### 内存管理概述 在C语言中,内存管理是程序设计的核心部分之一。理解并正确使用内存分配策略对于编写高效、可靠的程序至关重要。C语言提供了两种主要的内存分配方式:静态内存分配和动态内存分配。这两种方式在...
### 内存管理概述 #### 内存管理方法 Ptmalloc2采用了一系列高级策略来优化内存管理: - **边界标记法**:通过在分配的内存前后添加额外的元数据,用于检测内存溢出和回收。 - **分箱式内存管理**:将内存划分为...
本视频教程将深入探讨Windows驱动编程与内存管理的相关知识,以下是详细内容概述: 一、Windows驱动程序开发基础 驱动程序分为内核模式驱动和用户模式驱动,前者运行在更高的权限级别,直接与硬件交互,后者则作为...
一、Linux 内存管理概述 Linux 内存管理是指对系统内存的分配、释放、映射、管理、交换、压缩等一系列操作的管理。在 Linux 中,内存被划分为多个区域,每个区域有不同的作用,包括内核空间、用户空间、缓存、交换...
### eCos系统的内存管理 #### 一、概述 eCos(Embedded Configurable Operating System)是一款专为嵌入式系统设计的可配置操作系统。其内存管理机制对于确保系统稳定性和提高性能至关重要。本文将深入探讨eCos...
1. Xen的内存管理概述: Xen的内存管理涉及到内存分配、隔离和优化,以确保每个虚拟机(也称为Domain)能够独立地运行其操作系统和应用程序,而不会相互干扰或导致资源争抢。Xen采用了一种称为地址空间划分的技术,...
### 内存管理知识点概述 #### 一、内存的基本概念 - **主存**:即物理内存,是我们常说的RAM的大小,它直接与CPU通信,用于存储正在运行的程序和数据。 - **虚拟内存**:通过操作系统的技术,将硬盘的一部分空间...
3. Ptmalloc内存管理概述 Ptmalloc是Glibc中的多线程内存管理系统,其设计目标是在多线程环境下提供高效的内存分配和回收。Ptmalloc的核心特点是为每个线程维护一个独立的内存池,减少锁竞争,提高并发性能。 3.1.1...
- **内存管理**:Go采用自动垃圾回收机制,减轻了程序员在内存管理方面的负担。 - **跨平台性**:Go语言支持多种操作系统和硬件架构,便于编写跨平台的应用程序。 - **标准库**:Go提供了一个功能丰富的标准库,覆盖...
##### 3.2 Ptmalloc内存管理概述 **3.2.1 简介** Ptmalloc2是Glibc的一部分,专门用于管理进程的堆内存。它采用了多种高级算法和技术来提高内存管理的效率和可靠性。 **3.2.2 内存管理的设计假设** Ptmalloc2...
#### 二、Delphi内存管理概述 在Delphi中,默认情况下并没有内置内存管理器,这意味着开发者如果使用最小化内核开发应用,则需要手动管理内存,通常采用的是Win32 API来进行内存的分配、使用和释放。这种方式虽然...
#### 二、Spark内存管理概述 在执行Spark应用时,集群会启动两种类型的JVM进程:Driver和Executor。Driver进程主要负责创建Spark上下文、提交作业(Job)以及协调任务(Task)的调度;而Executor进程则在各个工作节点上...
堆内存管理概述 在 Linux 系统中,进程的虚拟地址空间可以分为四个部分:代码段、静态数据段、堆内存段和栈内存段。其中,堆内存段是进程动态分配内存的区域,它的大小可以根据进程的需求动态地变化。堆内存管理的...
#### 二、内存管理架构概述 Python的内存管理机制可以被抽象为一种层次结构,如图1所示: ![Python内存管理机制的层次结构](http://blog.donews.com/lemur/2005-10-10) **图1**:Python内存管理机制的层次结构 ...
在APR中,内存池(Memory Pool)是一个重要的概念,它为高效、可靠且节省资源的内存管理提供了基础。 内存池是一种优化内存分配策略的机制,它允许应用程序一次性申请一大块内存,然后根据需要从中分配小块内存给...