转自:
http://hi.baidu.com/gamestests/item/d0a28a18f3e27a36b9318025
每当cocos2d在屏幕上回执一个纹理(一张图片)时,图形硬件都需要做前后三个动作:准备渲染、渲染图形和渲染后的清除。这些工作产生了一个纹理所共有的开销。如果要缓解此状况(大量的图形渲染造成大量的开销),就需要让硬件知道需要进行渲染的这一组精灵使用的是同一纹理。这样图形硬件就会为这组精灵只进行一次准备、渲染和清除的工作。
有没有完过雷电类的游戏,想象一下,当你发出大量的子弹时,若是按照一般的做法每个子弹都渲染一次的话,开销会很大。
这个时候就显示出CCSpriteBatchNode的好处来了,下面介绍下CCSpriteBatchNode。
先看个简单的例子:
一般情况下,我们向屏幕上添加一个子弹精灵是这样:
CCsprite *bullet = [CCSpritespriteWithFile:@”bullet.png”];
[self addChild:bullet];
当我们添加多个子弹时:
for(int I = 0;i<1000;i++)
{
CCsprite *bullet= [CCSprite spriteWithFile:@”bullet.png”];
[self addChild:bullet];
}
这样会开销很大。
如果使用CCSpriteBatchNode的话可以这样做:
CCSprite *batch = [CCSpritebatchNodeWithFile:@”bullet.png”];
[self addChild:batch];
CCSprite *bullet = [CCSpritespriteWithFile:@”bullet.png”];
[batch addchild:bullet];
看起来很繁琐,不向能解决问题的样子。是的,创建单个子弹效果不好,但是如果创建大量子弹那就不能相提并论了。
for(int I = 0;i<1000;i++)
{
CCsprite *bullet= [CCSprite spriteWithFile:@”bullet.png”];
[batch addChild:bullet];
}
有么有发现CCSpriteBatchNode和cocos2d的一个东西很像?没想出来的想想CCLayer!是的,和CCLayer很类似,事实上,它的特性也和CCLayer相似。
-
在同一个CCSpriteBatchNode上添加的子节点的z值只能在CCSpriteBatchNode调整绘制的顺序。这样的话你如果想创造显示在一个怪物上的子弹和显示在怪物下的子弹,你需要创建两个CCSpriteBatchNode,通过调整CCSpriteBatchNode的z值达到效果。
-
这里要注意下,CCSprite使用的纹理必须和CCSpriteBatchNode相同。看似很狭隘,但是如果你使用纹理图册(纹理图册中可以有很多不同的图像)时,就能和好的解决这个问题。实际上当使用纹理图册时,也可以很好的解决z值问题,比如说,把怪物图片添加到纹理图册中。
一个很多图像的纹理图册,制作纹理图册k可以参考http://www.2cto.com/kf/201110/108425.html
知道了怎么chuchua创建一个纹理图册,那么我们下面看通过使用纹理图册加载不同的图片精灵进入CCSpriteBatchNode:
CCSpriteFrameCache*frameCache = [CCSpriteFrameCachesharedSpriteFrameCache];
[frameCache addSpriteFramesWithFile:@"frames.plist"];
CCSpriteBatchNode*batch = [CCSpriteBatchNodebatchNodeWithFile:@"frames.png"];
[self addChild:batch];
CCSprite*sprite = [CCSpritespriteWithSpriteFrameName:@"frameone.png"];
[batch addChild:sprite];
CCSprite*sprite = [CCSpritespriteWithSpriteFrameName:@"frametwo.png"];
[batch addChild:sprite];
这样看似向batch中添加了不同的图像精灵,其实不然,frames 是所有图组合成的大图。
看提示就能发现CCSpriteBatchNodej添加子精灵节点时,检查的是文件的id,我们通过纹理图册加载精灵shi时使用的是同一张图片文件,所以成功。当加载不同文件时提示失败(个人看法);