cocos2d-x 内存管理3
来源:互联网 发布:流程优化原则 编辑:程序博客网 时间:2024/05/20 08:01
使用或者不使用自动管理对于编程接口来说是一样的,都是调用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 内存管理3
- Cocos2d-x 内存管理
- cocos2d-x:内存管理
- Cocos2d-x内存管理
- Cocos2d-x内存管理
- COCOS2D-X内存管理
- Cocos2d-x 内存管理
- cocos2d-x内存管理
- cocos2d-x内存管理
- cocos2d-x 内存管理
- Cocos2d-x 内存管理
- Cocos2d-x内存管理
- cocos2d-x 内存管理
- Cocos2d-x内存管理
- Cocos2d-x::内存管理
- Cocos2d-x内存管理
- Cocos2d-x内存管理
- cocos2d-x 内存管理
- MyBatis的Cache实际意义不大
- (C# winform )可执行文件加密
- 正则 取出url中的数值
- 转文:Nginx+Tomcat 负载均衡集群方案
- LoadRunner中动态链接函数库(dll)的调用
- cocos2d-x 内存管理3
- 2007操作系统
- Flash builder4.5 破解方法
- 数据库中事务用法举例
- 数据库大小分布情况
- 算法杂货铺——分类算法之朴素贝叶斯分类
- Spring Transactional Propagation
- 《荒野星球》剧情根据角色变化
- nyoj 410 how many ones?