【问题标题】:Game fps shutting down游戏fps关闭
【发布时间】:2014-11-08 12:53:23
【问题描述】:

我为 Game Over Scene 创建了视图控制器。当我从 Game Over ViewController 重新启动游戏时,fps 正在关闭。第一次我的fps是30+,当我重新开始游戏时它关闭到20,我再次重新启动它关闭到10...... 有时我会看到这个错误:对 GameOverViewController 的开始/结束外观转换的不平衡调用:0x9bb8490>。

ViewController.m

- (void)awakeFromNib {
[[NSNotificationCenter defaultCenter]
 addObserver:self
 selector:@selector(goToGameOverViewController:)
 name:@"GoToGameOverViewController"
 object:nil];
}

-(void)goToGameOverViewController:(NSNotification *) notification {
GameOverViewController *gameOverController = [self.storyboard   instantiateViewControllerWithIdentifier:@"GameOverViewController"];

[self.navigationController pushViewController:gameOverController animated:NO];
 }
------------------------------------------------------------------------------

MyScene.m


- (void)gameOver {
[[NSNotificationCenter defaultCenter]
 postNotificationName:@"GoToGameOverViewController" object:self];
}

GameOverView.m


-(void)playPressed
{
GameViewController *gameController = [self.storyboard instantiateViewControllerWithIdentifier:@"GameViewController"];

[self.navigationController pushViewController:gameController animated:YES];
}

-(void)createPlayButton
{
UIButton *playBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[self.view addSubview:playBtn];

playBtn.frame = CGRectMake(100, 100, 200, 44);
[playBtn setTitle:@"Play Again" forState:UIControlStateNormal];
[playBtn sizeToFit];
[playBtn addTarget:self action:@selector(playPressed)  forControlEvents:UIControlEventTouchUpInside];
}

【问题讨论】:

    标签: ios ios7 sprite-kit


    【解决方案1】:

    您的代码和方法存在几个核心问题:

    1. 您不断地将UIViewControllers 推送到您的UINavigationController。取而代之的是,也许在一场比赛结束后,你打电话给popToRootViewControllerAnimated: 或其他。您在堆栈上推送的每个 UIViewController 都会永远存在。
    2. 您永远不会从NSNotificationCenter 中删除观察者。这意味着每次你完成一个关卡时,每个 viewController 都会尝试推送一个 GameOver viewController。这就是导致“不平衡......”警告的原因。如果您遵循我在 #1 中的建议,您应该只需要覆盖 dealloc 并调用以下代码来解决该问题。

    playPressed 中使用此代码:

    GameViewController *gameController = [self.storyboard instantiateViewControllerWithIdentifier:@"GameViewController"];
    [self.navigationController setViewControllers:@[gameController] animated:YES];
    

    稍后在GameViewController

    -(void)dealloc
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self]
    }
    

    这将确保您的 ViewController 以及您的场景被释放,并且您没有多个 ViewController 试图同时推送游戏。

    【讨论】:

      【解决方案2】:

      确保您在从ViewController 离开时释放您的SKScene

      -(void)goToGameOverViewController:(NSNotification *) notification {
          [((SKView *)self.view) presentScene:nil];
      
          GameOverViewController *gameOverController = [self.storyboard   instantiateViewControllerWithIdentifier:@"GameOverViewController"];
      
          [self.navigationController pushViewController:gameOverController animated:NO];
      }
      

      【讨论】:

      • 我的意思是,从技术上讲,这可以解决问题,但它实际上只是一个创可贴。持续推动 ViewControllers 是真正的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      相关资源
      最近更新 更多