【问题标题】:Cocos2d strange random freeze - what the heck is happening?Cocos2d 奇怪的随机冻结 - 到底发生了什么?
【发布时间】:2011-12-26 02:12:53
【问题描述】:

这个问题让我发疯了,我已经花了 5 天的时间来解决它。我在这里,迫切需要解决方案。

我正在 Cocos2d 上开发一个简单的游戏。循环方法:-(void)update:(CCTime)delta 在每个特定的时间间隔被调用。

这件事在 5 天前才开始发生,天知道为什么。在游戏循环中间的任何随机点,在游戏循环开始后大约 10 秒(可能从 5 到 20 秒不等),它会冻结,没有明显的原因。仪器不会检测到任何东西,调试器不会注意到任何东西。我注意到的是循环停止被调用。没有内存问题,或与之相关的任何事情。

没有特定的方法可以驱动这种冻结,这是完全随机的。同样的事情发生在 iPhone、iPad、iPod touch 上,无论它是否唯一运行的应用程序,以及它的 iOS 4.0 或 5.0...绝对没有从仪器中检测到泄漏,也没有 Zombie 对象。

我再说一遍,这不是崩溃,只是游戏循环中的冻结。 PS:即使图形被冻结,音乐仍然在后台运行。

我在 Xcode 4.2 上运行 iOS 5.0 和 Cocos2d 1.0.1,在 iPad 1、iPhone 4、3GS 和 iTouch 3g 上运行我的游戏,所有这些都在 iOS 5.0.1 上。同样的冻结....

有什么想法吗?请帮忙!

【问题讨论】:

  • 很难提出任何建议...尝试在每个重复方法的开始和结束处插入时间戳,以记录方法内代码执行的持续时间。如果这个问题是连续的,它必须告诉你原因在哪里。也许有些代码需要那个时间(也许纹理加载?)

标签: ios xcode random cocos2d-iphone freeze


【解决方案1】:

嗯,我知道用 coco(99.4 版)“停止”所有图形处理的可靠方法,同时触摸处理机制仍然完美工作。我刚刚检查了一个旧版本的项目,结果如下:

NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setObject:nil forKey:@"key"];

我刚刚在战斗场景总结和退出场景之一中添加了这个方法,果然如此。我得到的是一个死档,没有任何例外,音乐和触摸处理仍然有效。日志仍然显示我的触摸处理例程被处理和回调。这让我跺了很长时间,我现在“模仿”自己摆脱了类似的明显错误。如果在您的任何一个线程中发生类似的事情,该应用程序将为您提供“冻结”位。希望你能找到你的根本原因。

【讨论】:

  • 没有“可见”异常。在生活的实际方面,在调试时,您可以在 Xcode 的断点侧栏中(左下角的 + 按钮)添加一个 Exception catchall 断点。执行将在有问题的代码行上暂停(在上述情况下,无意义代码的 [dic setObject] 行。
【解决方案2】:

查找发送到名称以“unschedule”开头的方法的任何消息。

如果这没有帮助,一旦发生冻结,请在方法“tick”中的 CCScheduler 类中设置一个断点。如果 CCScheduler 没有“打勾”,请找出原因。如果它仍然滴答作响,请检查它的列表中是否还有任何选择器。为此,您可能需要在 CCScheduler 类的所有“取消调度”方法中设置断点,以找出谁在取消调度方法以及原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    相关资源
    最近更新 更多