3

我已经构建了一个小型 ipad 游戏,并且 spritesheets 和批处理节点到处都是。但是我不知道它们是如何工作的,何时添加精灵表,何时将精灵添加到 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% 的把握。请尽量解释它的基本原理。

  • 非常感谢 - 马丁
4

2 回答 2

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

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

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

  3. 当您期望大量具有相似纹理的精灵时,您必须使用批处理节点。例如,您希望每 2 秒生成 100 个硬币。如果您使用通常CCNode并在其上创建精灵,您的应用程序将CCSprite每 2 秒分配这 100 个对象。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/

于 2012-08-11T11:34:11.800 回答
0

现代渲染器 我们从头开始重写了渲染器。渲染图与场景图分离。这意味着最终支持自动批处理 :-) 并且新的渲染器非常快,我们不再鼓励使用 SpriteBatchNode。

精灵也有自动剔除。

好在我们没有牺牲任何旧功能:仍然支持自定义 OpenGL 命令!

参考这个链接

希望它有帮助

于 2014-11-14T02:41:50.343 回答