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-X2.2.3学习笔记3(内存管理)

前言: 本章节

【amazing cocos2d-x 3.0之十五】内存管理(3):如何优化内存使用

1. 内存优化原理

【cocos2d-x 3.x 学习笔记】对象内存管理

cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色(自动回收池)。

[cocos2d-x3.x学习笔记]引用计数 内存管理 Ref AutoreleasePoo PoolManager

Ref是根对象,老版本对应CCObject Ref内部可以通过引用计数来控制堆内存回收。retain()计数加一release()计数减一,当计数为0时,删除本对象。 AutoreleasePoo...

【Cocos2d-x 3.x】内存管理机制与源码分析

Cocos2d-x 3.x自己实现了一套内存管理机制,涉及内存管理池、单例模式等等。
  • JY_95
  • JY_95
  • 2015-11-09 03:44
  • 625

Cocos2d-x V3.x内存管理分析

原文:http://galoisplusplus.coding.me/blog/2014/07/30/memory-management-in-cocos2d-x-v3/ cocos...

【深入了解cocos2d-x 3.x】UI树(2)——UI树的内存管理机制

上篇文章分析了什么是UI树,以及UI树的使用方法,这节会重点分析UI树的内存管理机制以及如何利用UI树对游戏中的UI内存进行合理的管理。 说到UI树的内存管理机制,就不得不提cocos2d-x的内...

Cocos2d-x内存管理(二)

转载说明:http://blog.csdn.net/a7833756/article/details/7632199 Cocos2d-x内存管理(二) 前一篇我...

cocos2d-x学习笔记18:内存管理01:概述

一、概述 cocos2d-x最初移植自cocos2d的objective C版本。因此,在内存管理上,使用了和NSObject类似的引用计数器方法,相关接口放置在CCObject类中。  ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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