我想知道如何优化 CCSpriteBatchNode 的使用。换句话说,我理解:
- 1) 每个 CCSpriteBatchNode 实例对 draw 方法执行一次调用,从而减少 OpenGL 调用,从而显着提高性能
- 2) 每个 CCSpriteBatchNode 可以引用一个且唯一的纹理图集
我不能 100% 确定,我希望你的回答是:
3) 如果我有一个纹理图集,例如 game-art-hd.png,并在各种类中创建多个 CCSpriteBatchNode,我会得到多个绘制调用吗?换句话说,我假设 CCSpriteBatchNode 的每个实例都会调用自己的 draw 方法,从而导致多个 GL 绘图调用,并且性能低于拥有一个共享批处理节点。我对吗?
- 4) 如果我在 Sprite 上使用由多个帧组成的动画,我想我应该将动画帧添加到 Sprite 批处理节点。我该怎么做?
下面是关于我通常如何为精灵设置动画的代码片段。可以注意到,精灵帧没有添加到精灵批处理节点。为了获得更好的性能,我可能应该在初始化时执行此操作。它是否正确?
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. 您是否确认更倾向于避免在运行时向精灵批处理节点添加和删除精灵?
6) CCSpriteBatchNode 是否只考虑可见设置为 true 的精灵或位置实际上在屏幕区域之外的精灵?
关于 3 的其他注意事项
为了解决我在 3. 中的假设,并减少 CCSpriteBatchNode 实例的数量,我的解决方案将遵循@Suboptimus 在此答案中建议的内容。我喜欢初始化希望与 MainScene 类共享相同批处理节点的类的建议方法,而不是让它们通过 self.parent.parent.(...).parent.finallysharedbatchNode 访问 MainScene
其他人会建议通过使用 self.parent .....parent 并正确投射来引用 MainScene。
这也是软件工程方面的最佳方法吗?
我更喜欢通过使用对 MainScene 类的显式引用来明确添加精灵的位置。如果我在团队中工作或更改类层次结构,这应该会有所帮助。但是这样做的缺点是,如果我想将后续精灵添加到批处理节点,我“需要”存储对它的引用,从而导致需要维护更多代码。
我问这个问题的原因是,如果发现我传统的“软件工程”思维和“Cocos2d 父节点”层次结构方法之间存在轻微冲突。我是游戏编程的新手,我想了解在大型团队中工作的经验丰富的游戏开发人员使用哪种方法:)。H