可以通过很多方式用单个文件或者 纹理贴图集(Texture Atlases)来生成精灵。
纹理贴图集是一张包含很多图片的纹理贴图(图片),通常用于存放单个角色动画的所有动画帧。
实际上你可以把任何图片放进同一张纹理贴图中。我们的目的是把尽可能多的图片放进同一张纹理贴图中,以达到节省空间的目的。很多cocos2d开发者使用Zwoptex这个软件来创建纹理贴图集。
“精灵批处理”(Sprite Batching)是用于提高精灵渲染速度的技术。
它可以提高渲染大量相同精灵的速度,它同纹理贴图集配合使用的效率最高。
如果你将纹理贴图集与精灵批处理配合使用的话,你只要调用一次渲染方法就可以完成纹理贴图集里所有图片的渲染。
“渲染方法调用”(draw call)是把必要的信息传递给图形处理硬件以完成整个或者部份图片渲染的过程。
当你使用CCSprite的时候,每生成一个CCSprite 节点都会调用一次渲染方法。
每一次渲染方法调用导致的系统开销叠加起来会使游戏的帧率大约降低15%或者更多
(除非你使用CCSpriteBatchNode,它的 作用是作为一个额外的层用于添加多个精灵节点。
前提是这些精灵节点使用的是同一个纹理贴图)。
一、CCSpriteBatchNode
每次系统在屏幕上渲染一张贴图时,图形处理硬件必须首先准备渲染,然后渲染图形,最后在完成渲染以后进行清理。上述过程是每一次在启动渲染和结束渲染之间存在的固定系统开销。如果图形处理硬件知道你需要使用同一张纹理贴图渲染一组精灵的话,图形处理硬件将只需要为这一组精灵执行一次准备,渲染,最后清理的过程了。
把使用同一张纹理贴图的一组CCSprite节点添加到同一个CCSpriteBatchNode里,比逐个渲染CCSprite要高效很多。
创建多个CCSprite节点,将它们添加到同一个CCSpriteBatchNode中以提高渲染速度
1 CCSpriteBatchNode* batch = [CCSpriteBatchNode batchNodeWithFile:@"bullet.png"]; 2 [self addChild:batch]; 3 for (int i = 0; i < 100; i++) 4 { 5 CCSprite* sprite = [CCSprite spriteWithFile:@”bullet.png”]; 6 [batch addChild:bullet]; 7 }
CCSpriteBatchNode的作用很像CCLayer,因为它本身并不显示在屏幕上。不过 你只能把CCSprite加入CCSpriteBatchNode。
不过你只能把CCSprite加入CCSpriteBatchNode。CCSpriteBatchNode 将一个图片文件名作为参数,使用这个参数的原因是所有被添加进 CCSpriteBatchNode的CCSprite节点都必须使用同一个图片文件。
因为所有的CCSprite节点都添加到同一个 CCSpriteBatchNode中,所以所有CCSprite节点都会使用相同的z-order(深度)
来渲染。如果你的游戏要求子弹在敌人的前面和后面同时飞过的话,你就必须 使用两个CCSpriteBatchNode节点,因为只有这样你才能使用具有不同z-order 的子弹精灵。
通常,在默认的初始化方法-(Id)init中,不应该调用除了[super init]以外的方法。如果你必须在类的初始化方法中调用像[super initWith...]这样的方法,你应该将初始化方法命名为类似于-(id)initWith...这样的格式
1 +(id)bulletWithShip:(Ship *)ship { // 2 return [[[self alloc] initWithShip:ship] autorelease]; 3 } 4 5 6 -(id)initWithShip:(Ship *)ship { // 根据Ship位置设置子弹位置 7 if((self = [super initWithFile:@"bullet.png"])) { 8 float spread = (CCRANDOM_0_1() - 0.5f) * 0.5f; // 随机产生子弹Y值 9 velocity = CGPointMake(1, spread); // 定义子弹移动速度,X轴(横向)每桢走一个单位,Y轴(纵向)移动随机值 10 outsideScreen = [[CCDirector sharedDirector] winSize].width; // 得到设备宽度 11 self.position = CGPointMake(ship.position.x + ship.contentSize.width*0.5f // 根据Ship位置设置子弹位置 12 , ship.position.y); 13 [self scheduleUpdate]; 14 } 15 return self; 16 }