有人可以向我解释SpriteBatch节点和精灵表是如何工作的吗?

时间:2012-08-10 23:03:28

标签: iphone objective-c ipad cocos2d-iphone sprite-sheet

我已经建立了一个小的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”的文件,我所有的精灵都在这里。

    1. 每当我更改场景时,是否会创建一个新的批处理节点? spriteframecache应该保持不变吗?
    2. 如果我有两个精灵表文件,我将如何处理spriteframecache?
    3. 何时将子项添加到批处理节点,为什么?

我似乎并没有完全掌握这个概念。我知道为什么使用它。但是如果有人能够以外行的方式再次向我解释一切,我真的很感激,所以我对我所做的事情100%肯定。请尝试解释它是基本的。

  • 非常感谢 -     马丁

2 个答案:

答案 0 :(得分:8)

  1. CCSpriteBatchNode是CCNode后继者,因此您必须为每个场景创建单独的实例。如果您有多个纹理文件,则可以在场景中使用多个批处理节点。

    CCSpriteFrameCache是单身,因此在应用程序生命周期内保持不变。

  2. 将两者都添加到CCSpriteFrameCacheCCSpriteFrameCache单例具有loadedFilenames_字段(NSMutableSet的实例),用于缓存所有场景的所有精灵帧。

  3. 当您期望大量具有相似纹理的精灵时,您必须使用批处理节点。例如,您希望每2秒生成100个硬币。如果您使用通常的CCNode并在其上创建精灵,您的应用程序将每2秒分配这100个CCSprite个对象。 CCSpriteBatchNode旨在提高性能和更好的内存使用率。它与UITableView一样,具有可重复使用的单元格。

    使用可重复使用的单元格滚动表格视图时,它不会创建新单元格。当必须在屏幕表视图上呈现新单元格时,只需在屏幕外找到具有相同重用标识符的单元格,并用新内容替换它的内容。 CCSpriteBatchNode以同样的方式运作。当您尝试向其添加新的精灵时,该节点会尝试在屏幕外找到未使用的精灵并替换它的内容。

    请记住,您添加到CCSpriteBatchNode的精灵必须使用纹理文件中的纹理来创建此批处理节点。

    以下示例基于您问题的代码:

  4. 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命令!

Refer this link

希望有所帮助