Multithreading Spritekit iOS应用程序主线程冻结,无明显错误或死锁

Multithreading Spritekit iOS应用程序主线程冻结,无明显错误或死锁,multithreading,ios7,sprite-kit,freeze,Multithreading,Ios7,Sprite Kit,Freeze,我有一个来自法国的问题要问你,所以我希望我的英语不会太差 这是我向社区提出的第一个问题,首先,我要感谢你们所有人,感谢你们提供了我在这里读了几个月的有用提示和答案,并为我的第一个iOS应用程序提供了很多帮助 我对iOS开发人员非常陌生,所以我希望我的问题不要太简单 来了: 我有一款Spritekit游戏运行得“相当好”,目前没有发现任何问题,除了在一些非常罕见的情况下,应用程序冻结并且永远不会“恢复”。这是一种突破游戏,所以我有球和砖块,我使用苹果物理世界和Spritekit的物理体。假设每50

我有一个来自法国的问题要问你,所以我希望我的英语不会太差

这是我向社区提出的第一个问题,首先,我要感谢你们所有人,感谢你们提供了我在这里读了几个月的有用提示和答案,并为我的第一个iOS应用程序提供了很多帮助

我对iOS开发人员非常陌生,所以我希望我的问题不要太简单

来了:

我有一款Spritekit游戏运行得“相当好”,目前没有发现任何问题,除了在一些非常罕见的情况下,应用程序冻结并且永远不会“恢复”。这是一种突破游戏,所以我有球和砖块,我使用苹果物理世界和Spritekit的物理体。假设每500次运行一次,主线程就会冻结。首先,我研究了死锁,因为我使用了一些多线程(GCD)。但这方面似乎没有什么问题。为了简化社区调查,我做了以下修改:代码中根本没有GCD。场景的更新方法中没有任何内容。现在一切都在主场景中运行。我很乐意发布一些代码,但不确定什么是相关的,因为我没有GCD和更新代码了

只有主线程似乎被窃听了

下面是主线程的btrace,希望它能有所帮助。每次冻结时,跟踪总是相同的

    * thread #1: tid = 0x519fe, 0x00000001941224d0 libsystem_m.dylib`__sincosf_stret, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
  * frame #0: 0x00000001941224d0 libsystem_m.dylib`__sincosf_stret
    frame #1: 0x000000018f2b864c PhysicsKit`b2SeparationFunction::Evaluate(int, int, float) const + 112
    frame #2: 0x000000018f2b79d0 PhysicsKit`b2TimeOfImpact(b2TOIOutput*, b2TOIInput const*) + 928
    frame #3: 0x000000018f2bfac0 PhysicsKit`b2World::SolveTOI(b2TimeStep const&) + 1144
    frame #4: 0x000000018f2c0318 PhysicsKit`b2World::Step(float, int, int) + 280
    frame #5: 0x000000018f2af248 PhysicsKit`-[PKPhysicsWorld stepWithTime:velocityIterations:positionIterations:] + 260
    frame #6: 0x000000018a38ce08 SpriteKit`-[SKScene _update:] + 616
    frame #7: 0x000000018a39ffc8 SpriteKit`-[SKView(Private) _update:] + 260
    frame #8: 0x000000018a39dab0 SpriteKit`-[SKView renderCallback:] + 876
    frame #9: 0x000000018a39b794 SpriteKit`__29-[SKView setUpRenderCallback]_block_invoke + 76
    frame #10: 0x000000018a3baa90 SpriteKit`-[SKDisplayLink _callbackForNextFrame:] + 288
    frame #11: 0x00000001002ffc80 libglInterpose.dylib`-[DYDisplayLinkInterposer forwardDisplayLinkCallback:] + 172
    frame #12: 0x000000018a114cbc QuartzCore`CA::Display::DisplayLinkItem::dispatch() + 36
    frame #13: 0x000000018a114ac8 QuartzCore`CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 300
    frame #14: 0x000000018840fe74 IOKit`IODispatchCalloutFromCFMessage + 364
    frame #15: 0x00000001874c08e0 CoreFoundation`__CFMachPortPerform + 192
    frame #16: 0x00000001874cee90 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 56
    frame #17: 0x00000001874cedf0 CoreFoundation`__CFRunLoopDoSource1 + 444
    frame #18: 0x00000001874cd014 CoreFoundation`__CFRunLoopRun + 1620
    frame #19: 0x000000018740dc20 CoreFoundation`CFRunLoopRunSpecific + 452
    frame #20: 0x000000018d0f5c0c GraphicsServices`GSEventRunModal + 168
    frame #21: 0x000000018a53efdc UIKit`UIApplicationMain + 1156
    frame #22: 0x0000000100117308 MyGameName`main(argc=1, argv=0x000000016fd37bf0) + 116 at main.m:16
    frame #23: 0x000000019400baa0 libdyld.dylib`start + 4
非常感谢您的时间,如果您需要更多信息或代码示例,请随时询问我

祝你周末愉快


Gradlon

您必须发布代码供我们分析,特别是您使用GCD的任何区域,并考虑调用堆栈场景更新方法中发生的任何情况。实际上,通过GCD干扰Sprite Kit是很容易的-排除任何GCD的使用,或者至少将所有“异步”调用分别更改为“同步”调用,使它们都在主线程上运行。感谢您的回答LearnCos2D。为了简化社区调查,我做了以下修改:代码中根本没有GCD。场景的更新方法中没有任何内容。现在一切都在主场景中运行。我很乐意发布一些代码,但不确定什么是相关的,因为我没有GCD和更新代码了。希望有人会有想法^^您是否在联系人回调方法中运行代码?如果是这样,试着评论一下。你确定游戏很冷,没有因为EXC\u坏访问、SIGABRT或其他原因而崩溃吗?再次感谢你的反馈。是的,只是僵住了,实际上我仍然不能很好地与它互动(例如,我仍然可以暂停游戏,但我必须等待60秒,然后才能考虑任何触摸或动作并继续)。我在联系人回调中有很多代码,所以我将在发布其他代码之前,按照您的建议对其进行一点检查。谢谢你的建议,伙计,因为它帮助我回顾了重要的事情。我没有double skview,但我想我终于找到了让我的应用程序如此冻结的原因:我仔细检查了所有疯狂的东西,但没有找到任何结果,最后我认为这是由于在操纵球精灵速度属性时简单的“除以0”造成的。这就是生活,但至少多亏了你,我对很多事情都做了仔细检查。