cocos2d-x 内存管理3

转载 2012年03月21日 14:58:33

使用或者不使用自动管理对于编程接口来说是一样的,都是调用release或者autorelease来释放资源。只是他们释放资源的时机不同。release会立马释放资源,如果使用autorelease,他会标记自己,在主循环中由CCPoolManager来释放资源。CCPoolManager每一次循环只会释放一个需要释放的资源。这样保证了游戏运行的流畅度,避免出现卡顿的现象。所以释放多个资源时,一般使用autorelease可以获得更佳的表现。

不推荐手动调用delete来释放资源,不过delete已自动管理的对象不会出现空指针错误。因为在CCObject的析构函数中就已经将自己从CCPoolManager中移去了。你还是要保证其他地方没有使用已经被删除的指针,这个原则总是适用的。用delete可能破坏结构的完整性,不能释放掉全部的资源。

01 bool HelloWorld::init()
02 {
03     CCSize size = CCDirector::sharedDirector()->getWinSize();
04          CCSprite* sprite = new CCSprite;
05     sprite->initWithFile("HelloWorld.png");
06     sprite->setPosition(ccp(size.width/2, size.height/2));
07  
08     CCSprite* sprite1 = *(sprites.begin());
09     sprite1->setPosition(ccp(size.width/2, size.height/2));
10     CCSprite* sprite2 = *(++sprites.begin());
11     sprite2->setPosition(ccp(size.width/2, size.height/2));
12     delete sprite2;
13     addChild(sprite);
14     addChild(sprite1);
15 //  addChild(sprite2);
16     return true;
17 }
18  
19 void HelloWorld::LoadSprite( void )
20 {
21     cocos2d::CCSprite* test;
22     test = new CCSprite;
23     test->initWithFile("test.png");
24     test->autorelease();
25     sprites.push_back(test);
26  
27     cocos2d::CCSprite* test2;
28     test2 = CCSprite::spriteWithFile("test2.png");
29     sprites.push_back(test2);
30 }

注意一点的是CCNode的addChild和removeChild会调用retain和release函数。下面的代码是可以工作的,注意到sprite1没有自动管理,removeformParent已经释放了资源,再一次调用release引发崩溃。

01 bool HelloWorld::init()
02 {
03     CCSize size = CCDirector::sharedDirector()->getWinSize();
04          CCSprite* sprite = new CCSprite;
05     sprite->initWithFile("HelloWorld.png");
06     sprite->setPosition(ccp(size.width/2, size.height/2));
07  
08     CCSprite* sprite1 = *(sprites.begin());
09     sprite1->setPosition(ccp(size.width/2, size.height/2));
10     CCSprite* sprite2 = *(++sprites.begin());
11     sprite2->setPosition(ccp(size.width/2, size.height/2));
12  
13     addChild(sprite);
14     addChild(sprite1);
15     addChild(sprite2);
16     sprite1->removeFromParentAndCleanup(true);
17 //  sprite1->release();
18     addChild(sprite1);
19     return true;
20 }
21  
22 void HelloWorld::LoadSprite( void )
23 {
24     cocos2d::CCSprite* test;
25     test = new CCSprite;
26     test->initWithFile("test.png");
27     sprites.push_back(test);
28  
29     cocos2d::CCSprite* test2;
30     test2 = CCSprite::spriteWithFile("test2.png");
31     sprites.push_back(test2);
32 }

sprite1的添加覆盖掉了sprite2。图片和上面的代码是一样的。

我所理解的Cocos2d-x Cocos2d-x 内存管理机制

C++内存管理C++显式堆内存管理性能上有一定优势,但有如下缺点: 野指针:指针指向的内容已经被释放,但是其他指针还可能指向它。 重复释放:重复释放一个已经释放的内存单元,或者释放一个野指针,都会导致...
  • sinat_24229853
  • sinat_24229853
  • 2016年07月21日 15:15
  • 379

Cocos2d-x 3.0 内存管理机制

在C++中,动态内存分配是一把双刃剑,一方面,直接访问内存地址提高了应用程序的性能,与使用内存的灵活性;另一方面,由于程序没有正确地分配与释放造成的例如野指针,重复释放,内存泄漏等问题又严重影响着应用...
  • vinrex
  • vinrex
  • 2014年10月16日 10:42
  • 5706

cocos2d-x的内存管理

内存管理是移动开发的非常重要的部分,控制不好很容易就爆内存。而内存引起的当机,在后面排查的时候是最麻烦的事情。 cocos2d-x的内存管理是模仿oc的引用计数方法。据说3.0在设计时,有讨论到底是...
  • ff_csdn
  • ff_csdn
  • 2014年02月10日 16:36
  • 1025

cocos2d-x 内存管理(3)

cocos2d-x  内存管理(3)~ 前两篇博文转自:http://blog.csdn.net/whuancai/article/details/23347143, 这边博文有助于理解cocos2d...
  • yangangkobe
  • yangangkobe
  • 2015年09月01日 09:40
  • 118

【cocos2d-x】cocos2d-x的内存管理

出自图书《制作自己的捕鱼达人》 复杂的内存管理 内存管理一直是一个不易处理的问题,开发者必须考虑分配回收的方式和时机,针对堆和栈做不同的优化处理,等等。内存管理的核心是动态分配的对象必须保证在使...
  • eclipse_c
  • eclipse_c
  • 2015年05月18日 22:47
  • 299

内存管理-之内核内存管理-基于linux3.10

关于启动过程内存管理见《内存管理-之启动》 如果需要,内存管理三篇文章整理成pdf了,下载地址http://download.csdn.net/detail/shichaog/8662135 第四章...
  • shichaog
  • shichaog
  • 2015年05月05日 22:22
  • 1747

【手游开发优化篇】cocos2d-x内存管理优化(内存是游戏的硬伤)

2014年05月24日更新 以前的关注点都是 怎么用 根本没有往深层次追踪过。为什么这么用。今天记录下: 如果我们用的是pvr.ccz的图片 加载到内存中是根据你到处是的像素格式来渲染到u...
  • xingchen1106
  • xingchen1106
  • 2015年03月27日 10:46
  • 1528

cocos2d-x优化内存和程序大小

转自:http://www.tuicool.com/articles/Nnq63y
  • azhou_hui
  • azhou_hui
  • 2014年07月19日 22:40
  • 5563

linux内存管理原理深入理解段式页式

前一段时间看了《深入理解Linux内核》对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看法和认识。 ...
  • h674174380
  • h674174380
  • 2017年07月20日 08:52
  • 501

Cocos2d-x内存管理(二)

Cocos2d-x内存管理(二)                       分类:             cocos2d-x 初入学堂              2012-11-21 17:12...
  • summerhust
  • summerhust
  • 2013年12月09日 18:34
  • 716
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2d-x 内存管理3
举报原因:
原因补充:

(最多只允许输入30个字)