我目前正在编写一个基于回合的SpriteKit游戏与一个或多个人工智能玩家。每个AI一次转一圈,并使用共享的solutionFinder实例找到自己的解决方案,但是在一个分离的线程中这样做,因为有时需要几秒钟.
[NSThread detachNewThreadSelector:@selector(findSolution:)
toTarget:self.scene.solutionFinder
withObject:self];...where self是当前的AI播放器,scene是它的父SKScene,它包含一个SKNode,它将AI玩家作为子级。当线程只运行几毫秒时,一切正常,但是当线程运行几秒钟时,我很少在SKScene的-(void)update:(CFTimeInterval)currentTime方法中得到一个-(void)update:(CFTimeInterval)currentTime异常。
我添加了一些异常抛出的NSLogs,问题在于取消引用包含AI玩家的SKNode。但是,记录指针指向的地址表明它没有从有效的访问更改为无效的访问--是否可能在线程完成时分离的线程不正确地释放SKNode,或者其他什么地方出错了?
NSThread调用的方法被包装在一个@autorelease中。
发布于 2014-05-08 09:51:28
因此,在尝试了大量的东西,包括malloc、NSZombie、@autorelease、GCD、performSelectorInBackground和其他一些东西之后,我仍然偶尔会崩溃。
不过现在已经修好了!在修复之前,包含所有播放器的SKNode被公开为一个属性,并通过需要访问的代码传递,我认为这就是问题所在,因为SpriteKit会不时地从我脚下扫过东西。现在,任何需要在类之间共享的对象都是通过我自己管理的NSArray共享的,经过几个小时的压力测试,问题似乎已经消失。
https://stackoverflow.com/questions/23327125
复制相似问题