2014-03-03 103 views
0

我們正在開發一款SpriteKit iOS7遊戲,遊戲效果很好,但是如果我們整合了以下任何一個庫,它會在發送到後臺時崩潰: - 飛艇。- Bugsense。 - Apptentive。墜毀:com.apple.spritekit.renderQueue

這裏是Crashlytics崩潰報告:

主題:崩潰:com.apple.spritekit.renderQueue

0 libGPUSupportMercury.dylib  0x3478b8f6 gpus_ReturnNotPermittedKillClient 
1 libGPUSupportMercury.dylib  0x3478c391 gpusSubmitDataBuffers 
2 IMGSGX543GLDriver    0x2ec9982d SubmitPackets 
3 GLEngine      0x320fbc3d gliPresentViewES + 172 
4 OpenGLES      0x32106139 -[EAGLContext presentRenderbuffer:] + 64 
5 SpriteKit      0x325701b1 -[SKView _renderContent] + 1216 
6 libdispatch.dylib    0x3a6fdd07 _dispatch_client_callout + 22 
7 libdispatch.dylib    0x3a703b9f _dispatch_barrier_sync_f_invoke + 26 
8 SpriteKit      0x3256fcc3 -[SKView renderContent] + 82 
9 SpriteKit      0x3256d663 __29-[SKView setUpRenderCallback]_block_invoke + 130 
10 SpriteKit      0x3258fddb -[SKDisplayLink _callbackForNextFrame:] + 254 
11 QuartzCore      0x3234f9cf CA::Display::DisplayLinkItem::dispatch() + 98 
12 QuartzCore      0x3234f779 CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 344 
13 IOMobileFramebuffer   0x34f4576d IOMobileFramebufferVsyncNotifyFunc + 104 
14 IOKit       0x30be7a75 IODispatchCalloutFromCFMessage + 248 
15 CoreFoundation     0x2fec5e21 __CFMachPortPerform + 136 
16 CoreFoundation     0x2fed09df __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 34 
17 CoreFoundation     0x2fed097b __CFRunLoopDoSource1 + 346 
18 CoreFoundation     0x2fecf14f __CFRunLoopRun + 1398 
19 CoreFoundation     0x2fe39c27 CFRunLoopRunSpecific + 522 
20 CoreFoundation     0x2fe39a0b CFRunLoopRunInMode + 106 
21 GraphicsServices    0x34b29283 GSEventRunModal + 138 
22 UIKit       0x326dd049 UIApplicationMain + 1136 
23 SplishyFish     0x000a95d1 main (main.m:16) 
+0

'gpus_ReturnNotPermittedKillClient'幾乎總是表明你在應用程序處於後臺時渲染OpenGL ES內容。發生這種情況時,您的應用程序會立即死亡您需要確保Sprite Kit在開始轉換到背景後不會嘗試渲染任何東西。 –

+0

@BradLarson但是爲什麼只有當我包含這些庫(Airship,Bugsense或Apptentive)之一時纔會崩潰,並且在我沒有改變任何代碼的情況下,我都會對它們進行評論而不會崩潰。我應該如何使用spritekit在app進入後臺時停止渲染? –

+0

你是否可以在模擬器的調試器中重現這一點?你可以用這種方式縮小範圍。 – prototypical

回答

2

Apptentive,至少,不作任何OpenGL調用。我懷疑將庫添加到您的應用程序可能只是暴露了在其他一些情況下會發生的問題(例如,當應用程序正在後臺運行時,在主運行循環中存在待處理事件時)。

這就是說,上述回溯是一樣的人在這個線程:這

Spritekit crashes when entering background

的還有這裏提出一個解決方案:

Sprite Kit & playing sound leads to app termination

存在的問題在應用程序正在背景中時播放音頻。這可能是問題嗎?如其他人所說,如果不是,其他可能的罪魁禍首將是OpenGL rendering

+0

感謝您的回覆,我同意其他庫不應該是問題的原因,是的,我已經嘗試過並檢查了您在發佈我的這裏之前發佈的所有問題,但都沒有解決問題,謝謝。你的幫助。 –

0

我在沒有使用音頻的遊戲中解決了這個問題。個解決辦法是進入後臺時暫停SKView:

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    SKView *view = (SKView *)self.window.rootViewController.view; 
    if (view) { 
     view.paused = YES; 
    } 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    SKView *view = (SKView *)self.window.rootViewController.view; 
    if (view) { 
     view.paused = NO; 
    } 
} 
+0

A做到了這一點,但它仍然沒有工作(沒有音頻)。 – igraczech

1

我遇到了同樣的問題,在斯威夫特和我解決了用下面的代碼的問題:

func applicationDidEnterBackground(application: UIApplication) 
{ 
    var skView:SKView = self.window?.rootViewController?.view as! SKView 
    skView.paused = true 
} 


func applicationWillEnterForeground(application: UIApplication) 
{ 
    var skView:SKView = self.window?.rootViewController?.view as! SKView 
    skView.paused = false   
}