【发布时间】:2012-09-09 17:53:23
【问题描述】:
我想知道如何优化 CCSpriteBatchNode 的使用。换句话说,我理解:
- 1) 每个 CCSpriteBatchNode 实例执行一次 draw 方法调用,从而减少 OpenGL 调用,从而显着提高性能
- 2) 每个 CCSpriteBatchNode 只能引用一个纹理图集
我不能 100% 确定,我希望您的回答是:
-
3) 如果我有一个纹理图集,例如game-art-hd.png,并创建几个 各种类中的 CCSpriteBatchNode 我会收到多个绘图调用吗? 换句话说,我假设 CCSpriteBatchNode 的每个实例都会 调用自己的draw方法,导致多次GL绘图调用和 性能低于拥有一个共享批处理节点。我说的对吗?
- 4) 如果我在 Sprite 上使用由多个帧组成的动画,我 猜想我应该将动画帧添加到 Sprite 批处理节点。如何 我可以这样做吗?
下面有一段代码 sn-p 说明了我通常如何为精灵设置动画。可以注意到,精灵帧没有添加到 精灵批处理节点。 为了获得更好的性能,我可能应该这样做 在初始化时。这是正确的吗?
NSMutableArray* frames = [[NSMutableArray alloc]initWithCapacity:2]; for (int i = 0; i < 4; i++) { NSString*bulletFrame = [NSString stringWithFormat:@"animation-%i.png", i]; CCSpriteFrame* frame = [[CCSpriteFrameCache sharedSpriteFrameCache]spriteFrameByName:bulletFrame]; [frames addObject:frame]; } CCAnimation* anim = [CCAnimation animationWithFrames:frames delay:0.1f]; CCAnimate* animate = [CCAnimate actionWithAnimation:anim]; CCRepeatForever* repeat = [CCRepeatForever actionWithAction:animate]; [self runAction:repeat]; } 5) 部分参考 4. 你确认那是宁愿避免 在运行时向 sprite 批处理节点添加和删除 sprite?
6) CCSpriteBatchNode 是否只考虑可见设置为 true 的精灵或位置实际上在屏幕区域之外的精灵?
关于 3 的其他注意事项
为了解决我在 3. 中的假设,并减少 CCSpriteBatchNode 实例的数量,我的解决方案将遵循 @Suboptimus 在此 answer 中的建议。我喜欢初始化希望与 MainScene 类共享相同批处理节点的类的建议方法,而不是让它们通过 self.parent.parent.(...).parent.finallysharedbatchNode 访问 MainScene
其他人会建议通过使用 self.parent.....parent 并正确转换来引用 MainScene。
这也是软件工程方面的最佳方法吗?
我更喜欢使用对 MainScene 类的显式引用来明确添加精灵的位置。如果我在团队中工作或更改类层次结构,这应该会有所帮助。但是这样做的缺点是,如果我想将后续精灵添加到批处理节点,我“需要”存储对它的引用,从而导致需要维护更多代码。
我问这个问题的原因是,如果我发现我传统的“软件工程”思维和“Cocos2d 父节点”层次结构方法之间存在轻微冲突。我是游戏编程的新手,我想了解在大型团队中工作的经验丰富的游戏开发人员使用哪种方法:)。 H
【问题讨论】:
标签: cocos2d-iphone ccsprite atlassprites