0

我目前正在编写一个包含一个或多个 AI 玩家的回合制 SpriteKit 游戏。每个 AI 一次轮到一个,并使用共享实例找到自己的解决方案solutionFinder,但在分离线程中执行此操作,因为有时需要几秒钟......

[NSThread detachNewThreadSelector:@selector(findSolution:)
    toTarget:self.scene.solutionFinder 
    withObject:self];

...whereself是当前 AI 玩家,并且scene是 parent SKScene,其中包含一个SKNode以 AI 玩家为孩子的。当线程只运行几毫秒时,一切都很好,但是当线程运行几秒钟时,我很少SKScene在's-(void)update:(CFTimeInterval)currentTime方法中得到 EXC_BAD_ACCESS 异常。

我添加了一些引发异常的 NSLog,它正在取消引用SKNode包含问题的 AI 播放器的 NSLog。但是,记录指针指向的地址表明它不会从有效访问变为无效访问 - 分离线程是否可能在线程完成时错误地释放 SKNode,或者是否有其他问题?

NSThread 调用的方法被包裹在一个@autorelease.

4

1 回答 1

0

因此,在尝试了包括 malloc gaurds、NSZombie、@autorelease、GCD、performSelectorInBackground 和其他一些零碎的东西之后,我仍然偶尔会遇到崩溃。

不过现在已经修好了!在修复之前,包含所有玩家的 SKNode 被暴露为属性并通过需要访问的代码传递,我认为这是问题所在,因为 SpriteKit 会不时从我脚下扫过东西。现在,任何需要在类之间共享的对象都通过我自己管理的 NSArray 共享,经过数小时的压力测试,问题似乎已经消失。

于 2014-05-08T09:51:28.733 回答