2013-10-18 51 views
6

我收到一个错误报告,下面的堆栈跟踪,我不知道问题是什么。我见过这样的建议,这可能是由纹理图集中的发射器图像引起的,或者是在添加了同一个运行循环的情况下删除了发射器引起的,但我不认为这些发生了。这是一个零星的问题,我不能重新创建它。我只在错误报告中看到它。我会喜欢任何帮助。什么是Sprite Kit中的SKSpinLockSync,我该如何解决它

0 libsystem_platform.dylib OSSpinLockLock + 1 
1 SpriteKit SKSpinLockSync(int*, void()() block_pointer) + 92 
2 SpriteKit -[SKTexture loadImageData] + 300 
3 SpriteKit -[SKTexture size] + 42 
4 SpriteKit SKCEmitterSprite::update(double) + 3136 
5 SpriteKit SKCSprite::update(double) + 354 
6 SpriteKit SKCSprite::update(double) + 354 
7 SpriteKit -[SKScene _update:] + 174 
8 SpriteKit -[SKView(Private) _update:] + 324 
9 SpriteKit -[SKView renderCallback:] + 820 
10 SpriteKit __29-[SKView setUpRenderCallback]_block_invoke + 130 
11 SpriteKit -[SKDisplayLink _callbackForNextFrame:] + 254 
12 QuartzCore CA::Display::DisplayLinkItem::dispatch() + 98 
13 QuartzCore CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 344 
14 IOMobileFramebuffer  IOMobileFramebufferVsyncNotifyFunc + 104 
15 IOKit IODispatchCalloutFromCFMessage + 248 
16 ... CoreFoundation __CFMachPortPerform + 136 
17 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 34 
18 CoreFoundation __CFRunLoopDoSource1 + 346 
19 CoreFoundation __CFRunLoopRun + 1406 
20 CoreFoundation CFRunLoopRunSpecific + 524 
21 CoreFoundation CFRunLoopRunInMode + 106 
22 GraphicsServices GSEventRunModal + 138 
23 UIKit UIApplicationMain + 1136 
24 myApplication main.m line 16 main 

编辑:我现在意识到,我得到的SKSpinLockSync问题在几个不同的情况,并不总是与发射器。我认为我经常用发射器看到它的唯一原因是因为这是应用程序中加载图像的狮子份额,所以它只是统计上最有可能的。堆栈轨迹的前四行总是相同的。所以,直至并包括[SKTexture Size]

回答

2

OSSpinLock是一种确保多线程应用程序中的原子操作的机制。

我不认为这里有多线程问题,而是loadImageData可能提供了在工作的原子部分期间崩溃的数据。这可能是由于包中缺少(或损坏或不支持的文件格式)纹理。这当然是一个发射器,导致纹理加载失败。

尝试在发布配置中测试您的应用(编辑方案)一段时间。一些错误仅在启用优化的发布版本中出现。您也可以构建一个adhoc版本的应用程序并将其部署到您的设备并进行测试。您现在的第一个目标应该是在您自己的设备上验证问题,否则可能难以确定。

调用堆栈给你提供了一些提示:问题是发射器是一个精灵的子节点,它是另一个精灵的子节点,它是场景的子节点。也许这缩小了它。

+0

这并不能解决我的问题,但它为我提供了一些关于在哪里寻找它的线索。谢谢。 – Kardasis

0

我在使用SpriteKit制作游戏时遇到了类似的问题。所有可从互联网搜索获得的帖子对解决方案无效。有时,如果动作包含多线程的概念,则特殊的动作类型会导致此问题,而不是由包中的纹理损坏或缺失。我确实解决了它!换句话说,即使看起来没有明显的多线程,你的代码也可能有一种多线程。

0

我有精确的问题(相同的崩溃日志堆栈)与Sprite工具包中的粒子。我花了很多时间尝试了很多东西 - 最后发现了它,看起来是因为源纹理位于Texture Atlas文件夹中,并且没有相应的@ 2x图像。尝试将纹理移出纹理图集和/或添加@ 2x版本的图像。

5

我有同样的问题,我发现,当我打电话

NSString *p = [[NSBundle mainBundle] pathForResource:name ofType:@"sks"]; 
SKEmitterNode *e = [NSKeyedUnarchiver unarchiveObjectWithFile:p]; 

很多次,它会随机崩溃的应用程序使用相同的崩溃日志

SKSpinLockSync(int*, void()() block_pointer) + 36 
-[SKTexture loadImageData] + 252 
-[SKTexture size] + 44 
SKCEmitterSprite::update(double) + 2928 

我觉得这是雪碧套件问题和希望苹果将尽快解决这个问题

我的解决方案是:不要每次调用unarchiveObjectWithFile

unarchiveObjectWithFile可能与IO有关,如果您经常像游戏中的每一帧那样执行该操作,或者该问题来自SKTexture缓存系统,则需要使用纹理数据并在非线程安全的情况下调用loadImageData时会出现问题。

所以我重用SKEmitterNode与副本,这里是我的功能

// Emitter Pool 
- (SKEmitterNode*)getEmitter:(NSString*)name { 
    if(!mDictEmitter) 
     self.mDictEmitter = [NSMutableDictionary new]; 
    SKEmitterNode *e = [mDictEmitter objectForKey:name]; 
    if(!e){ 
     NSString *p = [[NSBundle mainBundle] pathForResource:name ofType:@"sks"]; 
     e = [NSKeyedUnarchiver unarchiveObjectWithFile:p]; 
     [mDictEmitter setObject:e forKey:name]; 
    } 
    return [e copy]; 
} 
2

我经历过类似的情况下死机一样,是能够解决它

以我为例,我试图打通过SKAction回的图像序列:

[SKAction animateWithTextures: timePerFrame:] 

我不能确定的原因是什么,但我的预感是它有没有被预装纹理做。该方法的文档没有提供任何关于它们是否必须预加载的见解,因此它纯粹是猜测,但是从我收集的内容来看,SpriteKit似乎很窒息,因为它无法将图像加载得足够快,无法显示它们。

在任何情况下

,使用[SKTexture preloadTextures:...解决了我的暴跌完全

希望它可以帮助你和其他人呢!

0

如果使用SKEmitterNode并且同时创建超过1个(大概在同一时间),我的游戏仍然崩溃。我必须手动预加载(创建并添加发射器到场景),然后我能够防止崩溃,我必须让粒子效果被创建并添加到场景中并让其运行。然后我将粒子alpha设置为0,以隐藏它。那时我被失望,我预先装好了一切。

使用上面的SKEmitterNodegetEmitter方法,当我在同一时间创建超过1个发射器时,仍然崩溃。我通过在开始时创建一个粒子来解决这个问题,将它添加到场景中,并将它的alpha设置为0.这是一种很好的方式,它会打击,但它起作用并且不会崩溃。

例子:

@implementation MyGameScene 

- (instancetype)initWithSize:(CGSize)size 
{ 
    if(self = [super initWithSize:size]){ 
     HitEmitter *emitter = [HitEmitter particle]; // class method use getEmitter method 
     [self addChild:emitter]; 
     [emitter setName:@"temp"]; 
     [emitter setAlpha:0]; 

     // add a second timer to remove it. 
     [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(removeEmitter) userInfo:nil repeats:NO]; 
    } return self; 
} 
-1

我建立一个Spritekit应用。该应用程序不规则地崩溃,没有调试信息,只留下指向可怕的SKSpinLockLock的指针。该应用程序在一组复杂的“动画”操作中坠毁。像R.Randazzo在他的文章中提到的,懒惰的图像加载可能会导致这些问题。但是我的所有动画都使用预加载的图像。最终我发现了一个懒惰的加载图像“隐藏在阴影中”,等待被呈现为我的动画序列和用户交互的结果。在预加载这个图片之后,SKSpinLockLock的鬼魂也消失了。注:我正在开发IOS 7 +

相关问题