8

我在这里有一个 100% 可重现的崩溃。

观看 Game Center 屏幕(排行榜、成就)时,如果在 iOS7 中后台运行 cocos2d 2.1 应用程序会崩溃。按下主页按钮时它会立即崩溃。

CCGLView.m 中的第 275 行崩溃:

if(![_context presentRenderbuffer:GL_RENDERBUFFER])

令人烦恼的是,我在另一秒下载了官方 cocos2diphone 2.1 的新副本,安装了它的模板并在将其连接到与我已经设置了游戏中心排行榜等的有问题的应用程序相同的应用程序 ID 后运行主应用程序。它不会崩溃。所以我在lib里面的cocos2d文件夹上运行了一个diff,除了我在CCDrawingPrimitives.h/m中添加了一些C函数代码之外没有什么区别......应该不是问题。所以问题不应该出在 cocos2d 本身,而是以某种方式使用它或我的项目设置导致它。

更新:

问题似乎出在 2.1 甚至更早版本中使用的 cocos2d 应用程序模板中。它看起来像这样:

-(void) applicationDidEnterBackground:(UIApplication*)application
{
    if( [navController_ visibleViewController] == director_ )
        [director_ stopAnimation];
}

这里明显的错误是,如果你让 navController 打开一个 Game Center 控制器,那么当按下主页按钮时,director_ 的 visibleViewController 将是 GC 控制器,因此 stopAnimation 不会被调用。这会导致 iOS7 崩溃,但 iOS6 似乎没有……模板 cocos2d 2.1 应用程序也没有(这里仍然混淆)。

当前的修复是注释掉if( [navController_ visibleViewController] == director_ )以便总是调用 stopAnimation。不确定是否有任何副作用,但现在会继续使用。

4

1 回答 1

4

好决定。我遇到了和你一样的问题,你的帖子帮助我弄清楚我的应用程序是如何崩溃的。

所以我的解决方案是在显示游戏中心之前停止导演动画。

[[CCDirector sharedDirector] stopAnimation]
[[CCDirector sharedDirector] presentViewController:gcViewController animated:YES completion:nil];

然后在游戏中心视图中重启动画dismiss回调

- (void) gameCenterViewControllerDidFinish:(GKGameCenterViewController *)gameCenterViewController
{
    [[CCDirector sharedDirector] dismissViewControllerAnimated:YES completion:nil];
    [[CCDirector sharedDirector] startAnimation];
}

您更新的解决方案应该可以工作,但在这里也一样,我不确定是否会有任何副作用。我想将游戏中心本身包裹起来是一种更安全的方法。

再次感谢您发布这个问题!

于 2014-03-21T07:40:16.820 回答