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

原文 标签 iphone objective-c ipad cocos2d-iphone sprite-sheet

我已经构建了一个小 ipad 游戏,到处都是 spritesheets 和 batchnodes。但是我不知道它们是如何工作的,何时添加 Sprite 表,何时将 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”的文件,我所有的 Sprite 都在其中。
  • 每当我改变场景时,我是否会创建一个新的批处理节点? spriteframecache 应该保持不变吧?
  • 如果我有两个 sprite 表文件,我将如何处理 spriteframecache?
  • 我什么时候将子节点添加到批处理节点,为什么?

  • 我似乎真的没有完全理解这个概念。我大致知道我为什么使用它。但如果有人能用外行的方式再次向我解释一切,我会非常感激,所以我 100% 确定我在做什么。请尽量解释它的基本原理。
  • 非常感谢 -
    马丁
  • 最佳答案

  • CCSpriteBatchNode 是 CCNode 的后继者,因此您必须为每个场景创建单独的实例。如果您有多个纹理文件,您可以在场景中使用多个批处理节点。
    CCSpriteFrameCache是一个单例,所以它在应用程序生命周期内保持不变。
  • 将两者添加到 CCSpriteFrameCache . CCSpriteFrameCache单例有 loadedFilenames_字段(NSMutableSet 的实例)缓存所有场景的所有 Sprite 帧。
  • 当您期望大量具有相似纹理的 Sprite 时,您必须使用批处理节点。例如,您希望每 2 秒生成 100 个硬币。如果您使用通常 CCNode并在其上创建 Sprite ,您的应用程序将分配这 100 个 CCSprite对象每 2 秒。 CCSpriteBatchNode旨在提高性能和更好的内存使用。它的工作原理类似于 UITableView带有可重复使用的细胞。

    当您使用可重用单元格滚动表格 View 时,它不会创建新单元格。当必须在屏幕表格 View 上显示新单元格时,只需在屏幕外找到具有相同重用标识符的单元格,并将其内容替换为新内容。 CCSpriteBatchNode以同样的方式工作。当您尝试向其添加新 Sprite 时,节点会尝试在屏幕外查找未使用的 Sprite 并替换其内容。

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

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

  • 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/

    关于iphone - 有人可以向我解释 SpriteBatch 节点和 Sprite 表是如何工作的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11910317/

    相关文章:

    iphone - 嵌入在 UIWebView 中的电影播放器​​确实在 iPhone 上进入全屏,但在 iPad 上没有

    iphone - 核心图形库中的内存管理

    ios - UICollectionView中未调用数据源方法

    ios - 如何在ipad中创建Popover?

    iphone - UIPickerView 如何显示未选择的内容?

    ios - 显示信息屏幕和设置密码屏幕一次 iOS 7

    iOS In App Purchase 仅在 App 审查中崩溃 - 在沙盒测试中发现作品

    iphone - iphone/ipad上的初始宽度

    iphone - 在 Xcode 中有条件地链接第三方 API

    iphone - 导航 Controller 上的编辑按钮未进入编辑模式