【问题标题】:Frame Rate per Second (FPS) starts to gdecrease in Coco2d game iPhone?Cocos2d 游戏 iPhone 的每秒帧率 (FPS) 开始下降?
【发布时间】:2012-01-10 01:18:38
【问题描述】:

我有 2 只母鸡(6 幅图像)的三个简单图像,我正在尝试使用 Ray Wenderlich 的一个非常好的教程制作动画(一只母鸡行走):

http://www.raywenderlich.com/1271/how-to-use-animations-and-sprite-sheets-in-cocos2d

当我开始游戏时动画效果很好,但在 2-3 分钟后帧速率开始下降并慢慢下降到 10 以下并且应用程序挂起..顺便说一句,我正在使用 iPhone 3G 和 iOS 4.1 ...可以这是 FPS 下降的原因还是 iPhone 在一段时间后变得空闲?

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"hen.plist"];        


CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"hen.png"];
[self addChild:spriteSheet];

// Load up the frames of our animation
NSMutableArray *walkAnimFrames = [NSMutableArray array];
for(int i = 1; i <= 3; ++i) {
    [walkAnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"%d.png", i]]];
}
CCAnimation *walkAnim = [CCAnimation animationWithFrames:walkAnimFrames delay:0.1f];

self.bear = [CCSprite spriteWithSpriteFrameName:@"1.png"];        
_bear.position = ccp(20,400);
self.walkAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO]];
[_bear runAction:_walkAction];
[spriteSheet addChild:_bear];

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"monkey.plist"];        


CCSpriteBatchNode *spriteSheetMonkey = [CCSpriteBatchNode batchNodeWithFile:@"monkey.png"];
[self addChild:spriteSheetMonkey];

NSMutableArray *walkAnimFramesMonkey = [NSMutableArray array];
for(int i = 1; i <= 3; ++i) {
    [walkAnimFramesMonkey addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"%d.png", i]]];
}
CCAnimation *walkAnimMonkey = [CCAnimation animationWithFrames:walkAnimFramesMonkey delay:0.1f];


self.monkey = [CCSprite spriteWithSpriteFrameName:@"1.png"];        
_monkey.position = ccp(40,80);
self.walkMonkey = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walkAnimMonkey restoreOriginalFrame:NO]];
[_monkey runAction:_walkMonkey];
[spriteSheetMonkey addChild:_monkey];
float bearVelocity = 480.0/3.0;

CGPoint moveDifferenceHen = ccpSub(HenLoction, _bear.position);
float distanceToMoveHen = ccpLength(moveDifferenceHen);
float moveDurationHen = distanceToMoveHen / bearVelocity;

self.moveAction = [CCSequence actions:                          
                       [CCMoveTo actionWithDuration:moveDurationHen position:HenLoction],
                       [CCCallFunc actionWithTarget:self selector:@selector(bearMoveEnded)],
                       nil
                       ];


[_bear runAction:_moveAction]; 

【问题讨论】:

  • 如果您需要这方面的帮助,您可能需要发布一些代码。
  • 我已经添加了代码...当我尝试使用泄漏工具运行它时,它显示没有泄漏,但对象分配非常高,因为我也尝试每 1 秒使用计时器调用此代码???

标签: iphone ios4 cocos2d-iphone


【解决方案1】:

听起来你可能有内存泄漏。我的建议是在设备上运行 Leaks 和 ObjectAlloc Instruments。另外,如果您需要更详细的帮助,您应该发布相关代码。

【讨论】:

  • 我已经添加了代码......当我尝试使用泄漏工具运行它时,它显示没有泄漏,但对象分配非常高,因为我也尝试每 1 秒使用计时器调用此代码???
【解决方案2】:

似乎很可能是内存泄漏。

如果不是这样,那么我会查看您正在遍历的数据结构、您随着时间的推移构建的任何类型的决策树状元素之类的东西。任何不一定存在内存泄漏但可能会合法地变大或复杂的东西,需要增加处理时间。

如果应用程序必须在一秒钟内执行几次到多次,那么一切都会变慢。它可能会在几分钟内变得复杂或变大两倍,而早期的倍增仍然快速且易于计算。当它从原来的 256 倍复杂到 512 倍翻倍时,减速开始变得明显。

【讨论】:

  • 我已经添加了代码......当我尝试使用泄漏工具运行它时,它显示没有泄漏,但对象分配非常高,因为我也尝试每 1 秒使用计时器调用此代码???
  • 随着玩家玩游戏需要分配的对象越来越多吗?您还可以检查是否在 AppDelegate 中收到内存警告,这意味着您消耗了太多内存并且它正在减慢速度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多