我已经建立了一个小的ipad游戏,spritesheets和batchnodes到处都是。但是我不知道它们是如何工作的,何时添加精灵表,何时将sprite添加到spritebatchnode等等。
这是我在初始屏幕(主菜单)中所做的:
CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"sprites.png"];
screenSize = [CCDirector sharedDirector].winSize;
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"sprites.plist"];
[self addChild:spriteSheet];
在其他课程中 - 我总是需要使用相同的批处理节点 - > “sprites.png” - 我打电话给
CCSprite *someSprite = [CCSprite spriteWithSpriteFrameName:someSpriteFrameName.png];
并将其添加到self
。
[self addChild:someSprite]; // I do not understand why I would add my sprite to the batch node instead of self
所以情况如下:
我有一个名为“sprites.png”的文件,我所有的精灵都在这里。
我似乎并没有完全掌握这个概念。我知道为什么使用它。但是如果有人能够以外行的方式再次向我解释一切,我真的很感激,所以我对我所做的事情100%肯定。请尝试解释它是基本的。
答案 0 :(得分:8)
CCSpriteBatchNode是CCNode后继者,因此您必须为每个场景创建单独的实例。如果您有多个纹理文件,则可以在场景中使用多个批处理节点。
CCSpriteFrameCache
是单身,因此在应用程序生命周期内保持不变。
将两者都添加到CCSpriteFrameCache
。 CCSpriteFrameCache
单例具有loadedFilenames_
字段(NSMutableSet
的实例),用于缓存所有场景的所有精灵帧。
当您期望大量具有相似纹理的精灵时,您必须使用批处理节点。例如,您希望每2秒生成100个硬币。如果您使用通常的CCNode
并在其上创建精灵,您的应用程序将每2秒分配这100个CCSprite
个对象。 CCSpriteBatchNode
旨在提高性能和更好的内存使用率。它与UITableView
一样,具有可重复使用的单元格。
使用可重复使用的单元格滚动表格视图时,它不会创建新单元格。当必须在屏幕表视图上呈现新单元格时,只需在屏幕外找到具有相同重用标识符的单元格,并用新内容替换它的内容。 CCSpriteBatchNode
以同样的方式运作。当您尝试向其添加新的精灵时,该节点会尝试在屏幕外找到未使用的精灵并替换它的内容。
请记住,您添加到CCSpriteBatchNode
的精灵必须使用纹理文件中的纹理来创建此批处理节点。
以下示例基于您问题的代码:
CCSpriteBatchNode *batchNode = [CCSpriteBatchNode batchNodeWithFile:@"sprites.png"];
screenSize = [CCDirector sharedDirector].winSize;
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"sprites.plist"];
[self addChild:batchNode];
CCSprite *someSprite = [CCSprite spriteWithSpriteFrameName:@"someSpriteFrom_sprites.png_.png];
[batchNode addChild:someSprite]; // add sprite to batch node to get all advantages of it
这是一篇关于CCSpriteBatchNode性能的好文章:http://www.learn-cocos2d.com/2011/09/cocos2d-spritebatch-performance-test/
答案 1 :(得分:0)
现代渲染器 我们从头开始重写了渲染器。渲染图与场景图解耦。 这意味着支持自动批处理,最后:-)而且新的渲染器非常快,我们不再鼓励使用SpriteBatchNode。
Sprites也有自动剔除。
好消息是我们没有牺牲任何旧功能:仍支持自定义OpenGL命令!
希望有所帮助