概述
在屏幕上贴图时,图形硬件需要经过准备、渲染、清除等步骤。每次贴图都会重复这个过程。如果图形硬件能事先知道有一组拥有相同纹理的Sprite需要渲染,则这个过程会被简化。比如,一组Sprite的准备和清除动作总共只需要执行一次。
下图的例子使用了CCSpriteBacthNode。屏幕上同时有几百颗子弹飞过。如果一次只渲染一颗,那么帧率马上降到85%。使用CCSpriteBatchNode,可以避免这种情况:
通常我们这样创建一个CCSprite:
CCSprite* sprite=[CCSprite spriteWithFile:@”bullet.png”];
[self addChild:sprite];
而使用CCSpriteBatchNode 则需要修改为:
CCSpriteBatchNode* batch=[CCSpriteBatchNode batchNodeWithFile:@”bullet.png”];
[self addChild:batch];
for(int i=0;i<100;i++){
CCSprite* sprite=[CCSprite spriteWithFile:@”bullet.png”];
[batch addChild:bullet];
}
注意,CCSpriteBatchNode需要一个图片文件名作为参数,哪怕它根本用不着这个图片(进行显示)。可以把它看做是一个Layer,你可以用它来加入一些CCSprite节点。由于它使用了一个图片文件作为构造参数,所以在后面加入的CCSprite中必须使用相同的文件作为构造参数,否则会导致如下错误:
SpriteBatches[13879:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'CCSprite is not using the same texture id'
当采用相同纹理的CCSpite越多,则采用CCSpriteBatchNode的好处越明显。
但这有一个限制,所有的CCSprite节点都会位于同一个Z坐标(深度)上。如果子弹是“击穿”敌人并向后飞,你得使用两个Z轴不同的CCSpriteBatchNode。
另外一个限制是,CCSpriteBatchNode和加入其中的CCSprite必须使用相同的贴图。这一点在使用Texture Atlas时尤其显得重要。一个Texture Atlas可以画多个不同的图片,并且这些图片使用同一个CCSpriteBatchNode,以提高渲染速度。(Texture指纹理或贴图,Atlas指集,Texture Atlas就是纹理集,就是小图合成的一个大图,而TexturePacker是把一张图或多张图打成纹理集的工具,同时会有一个plist文件)
Texture Atlas用法
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(“A.plist”);
CCSpriteBatchNode* batchNode = CCSpriteBatchNode::create("A.png", 50);
CCSprite* sprite1 = CCSprite::createWithSpriteFrameName("精灵帧1的名字");
CCSprite* sprite2 = CCSprite::createWithSpriteFrameName("精灵帧2的名字");
//注:游戏资源里所有plist里的精灵帧的名字最好不要一样。否则当执行上面两行的时候,得到的精灵可能是其他plist下的Texture(纹理),这时候就可能会提示"CCSprite is not using the same texture id"这个错误了。
batchNode->addChild(sprite1);
batchNode->addChild(sprite2);
this->addChild(batchNode);
Z轴的问题可以通过指定CCSpriteBatchNode中单个CCSprite的Z值来解决。如果你所有的图片都放到了一个Texture Atlas(纹理集),则你完全可以只使用一个CCSpriteBatchNode。
把CCSpriteBatchNode看成一个简单的CCLayer,它只接受使用相同图片的CCSprite,这样,你就知道怎么用它了。
最后
以上就是活力麦片为你收集整理的使用SpriteBatchNode时出现CCSprite is not using the same texture id错误的全部内容,希望文章能够帮你解决使用SpriteBatchNode时出现CCSprite is not using the same texture id错误所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复