Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5519938
  • 博文数量: 763
  • 博客积分: 12108
  • 博客等级: 上将
  • 技术积分: 15717
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-28 21:21
个人简介

业精于勤,荒于嬉

文章分类

全部博文(763)

文章存档

2018年(6)

2017年(15)

2016年(2)

2015年(31)

2014年(14)

2013年(87)

2012年(75)

2011年(94)

2010年(190)

2009年(38)

2008年(183)

2007年(28)

分类: C/C++

2012-12-11 11:07:04

优点:CCSpriteBatchNode 中的所有CCSprite只会被渲染1次,因此可以提高游戏的FPS。

限制:加入到 CCSpriteBatchNode 中的CCSprite必须使用同一张纹理图。


问:什么时候应该用CCSpriteBatchNode?

答:比如游戏中的子弹 就很适合用它,因为子弹都是一个样子。

答:通过TexturePacker生成的纹理图也适合使用它。


看一个简单的Demo:

  1. CCSpriteBatchNode *batch = [CCSpriteBatchNode batchNodeWithFile:@"shopAmber.png"];//初始化时给一张纹理图  
  2. [self addChild:batch];//加入到当前Layer  
  3.           
  4. CCSprite *spr = [CCSprite spriteWithFile:@"shopAmber.png"];//切记! 这里的纹理图必须和上面相同,否则会崩溃~  
  5. spr.position = ccp(10,10);  
  6. [batch addChild:spr z:2];  
  7.           
  8. CCSprite *spr2 = [CCSprite spriteWithFile:@"shopAmber.png"];  
  9. spr2.position = ccp(10,40);  
  10. [batch addChild:spr2 z:1];//可以指定z坐标。  


以前写过一个游戏中的天气系统,今天有人说我的天气系统有点卡,不是很好用。我看下了他的代码,发现他改了我的代码,把CCSpriteBatchNode删除了,直接用addChild,每个sprite都是重新读取的贴图。

 

我想说,同学呀,你把暴风雪所有特效开启后,你有没有注意下你的游戏场景显示了1000多渲染批次。这能不卡吗?

 

今天刚好有点时间,我介绍下CCSpriteBatchNode,以及利用它优化游戏渲染效率。

在cocos2d-x 2.x 之后,大家都看到了左下角的FPS变成3行,多了两行数据。

最上面一行是指的当前场景的渲染批次。(简单理解为需要渲染多少个贴图出来)

中间一行是渲染每一帧需要的时间。

最下行就是大家熟悉的FPS。

 

CCSpriteBatchNode介绍:

1、先说下渲染批次:这是游戏引擎中一个比较重要的优化指标,指的是一次渲染凋用。也就是说,渲染的次数越少,游戏的运行效率越高。

2、CCSpriteBatchNode就是cocos2d-x为了降低渲染批次而建立的一个专门管理精灵的类。

 

举例介绍:

1、使用CCSprite创建1000个Icon.png到场景中,这样渲染批次就是1000(暂且不考虑其他的精灵)

1for(int i = 0;i < 1000;++i){
2 int x = arc4random()%960;
3 int y = arc4random()%640;
4 CCSprite* testIcon = CCSprite::create("Icon.png");
5 testIcon->setPosition( ccp(x, y) );
6 this->addChild(testIcon);
7}

效果图如下:

上面的效果图可以看到,创建了1000个Icon到场景中,这是的FPS是22,渲染批次是1000次。

 

2、使用CCSpriteBatchNode批量渲染,一次渲染就把所有的CCSprite绘制出来。大大降低渲染批次。

举例介绍:

1、使用CCSprite创建1000个Icon.png到场景中,但是这里利用了CCSpriteBatchNode批量渲染。这时的渲染批次、FPS如何呢?

01CCSpriteBatchNode* batchNode = CCSpriteBatchNode::create("Icon.png", 1000);
02batchNode->setPosition(CCPointZero);
03this->addChild(batchNode);
04 
05for(int i = 0;i < 1000;++i){
06 int x = arc4random()%960;
07 int y = arc4random()%640;
08 CCSprite* testIcon = CCSprite::createWithTexture(batchNode->getTexture());
09 testIcon->setPosition( ccp(x, y) );
10 batchNode->addChild(testIcon);
11}

效果图如下:

上面的效果图可以看到,创建了1000个Icon到场景中,这是的FPS是39.9,渲染批次是1次。

 

注:

1、
CCSpriteBatchNode::create(const char *fileImage);//利用贴图创建,默认子节点数量29.(数量不够时,系统会自己增加)
CCSpriteBatchNode* batchNode = CCSpriteBatchNode::create(const char *fileImage, unsigned int capacity);//利用贴图创建,并指定子节点数量

2、

使用CCSpriteBatchNode时,所使用的贴图必须是同一张图片,也不能指定精灵的深度。所有的精灵都必须在同一渲染层。

3、

但是项目中总不可能局限于一张贴图上,所以你可以把多张贴图合并成一张大贴图(合并的工具很多,我不介绍了)。所以利用合成后的大贴图创建一个CCSpriteBatchNode。
然后创建CCSprite的时候,设置贴图的区域就可以了。









阅读(6644) | 评论(0) | 转发(2) |
0

上一篇:C++ string 类常用函数

下一篇:Ios 资料链接

给主人留下些什么吧!~~