2014-09-19 11 views
12

iOS8'den itibaren oyunum aniden çökmeye başladı.iOS 8 SpriteKit, bir çocuğu blok/eylemden ekleme veya kaldırma konusunda çöküyor

[sparkNode runAction:[SKAction sequence:@[ 
              //Some actions and finally... 
              [SKAction removeFromParent]]]]; // Crashes here (If I remove this action no crash occurs) 

Ve ikinci sırada:

[rankTransitionSprite runAction:[SKAction sequence:@[[SKAction scaleTo:1.5 duration:1.0], 
                [SKAction runBlock:^{ 
    CGPoint rankPosition = _rankSprite.position; 
    [_rankSprite removeFromParent]; 
    _rankSprite = [_spritesFactory spriteFromAtlasForImageName:[NSString stringWithFormat:@"rank%d", rank]]; 
    [self addChild:_rankSprite]; // Crashes here 
}], 
                [SKAction scaleTo:0.0 duration:1.0], 
                [SKAction removeFromParent]]]]; 

iOS 7.1 üzerinde çökme meydana DEĞİLDİR ayıklama biraz sonra ben iki aşağıdaki yerlerde oyun çöküyor bulduk. Sadece iOS8'de çöküyor. İlk çarpışma için Birlikte removeFromParent müdahalesinin yerine:

[SKAction runBlock:^{ 
         dispatch_async(dispatch_get_main_queue(), ^{ 
          [sparkNode removeFromParent]; 
         }); 
}] 

Ve bu sorunu çözmek gibi görünüyor.

İkinci kilitleme için aynı şeyi yaptım (ana iş parçacığındaki hareketli grafiğin eklenmesi) ve kilitlenme giderildi.

Kilitlenme günlük:

Thread 0 Crashed:: Dispatch queue: com.apple.spritekit.renderQueue 
0 SpriteKit      0x000000010abed9fe SKCRenderer::preprocessSpriteImp(std::__1::vector<SKCRenderer::SpriteRenderInfo, std::__1::allocator<SKCRenderer::SpriteRenderInfo> >&, SKRenderQuadPool&, SKCSprite const*, _GLKMatrix4 const&, float, unsigned int&, bool) + 372 
1 SpriteKit      0x000000010abee82b SKCRenderer::preprocessSpriteImp(std::__1::vector<SKCRenderer::SpriteRenderInfo, std::__1::allocator<SKCRenderer::SpriteRenderInfo> >&, SKRenderQuadPool&, SKCSprite const*, _GLKMatrix4 const&, float, unsigned int&, bool) + 4001 
2 SpriteKit      0x000000010abee82b SKCRenderer::preprocessSpriteImp(std::__1::vector<SKCRenderer::SpriteRenderInfo, std::__1::allocator<SKCRenderer::SpriteRenderInfo> >&, SKRenderQuadPool&, SKCSprite const*, _GLKMatrix4 const&, float, unsigned int&, bool) + 4001 
3 SpriteKit      0x000000010abe7c21 SKCRenderer::preprocessAndSubmitSpriteInternal(std::__1::vector<SKCRenderer::SpriteRenderInfo const*, std::__1::allocator<SKCRenderer::SpriteRenderInfo const*> >&, std::__1::vector<SKCRenderer::SpriteRenderInfo, std::__1::allocator<SKCRenderer::SpriteRenderInfo> >&, SKRenderQuadPool&, SKCSprite const*, _GLKMatrix4 const&) + 139 
4 SpriteKit      0x000000010abeb7d1 SKCRenderer::submitScene(SKScene*, bool) + 393 
5 SpriteKit      0x000000010abeff16 SKCRenderer::renderScene(SKScene*, bool) + 86 
6 SpriteKit      0x000000010ab87542 -[SKView _renderContent] + 1027 
7 libdispatch.dylib    0x000000010c974b94 _dispatch_client_callout + 8 
8 libdispatch.dylib    0x000000010c9611e7 _dispatch_barrier_sync_f_invoke + 76 
9 SpriteKit      0x000000010ab870f3 -[SKView renderContent] + 89 
10 SpriteKit      0x000000010ab8415c __29-[SKView setUpRenderCallback]_block_invoke + 54 
11 SpriteKit      0x000000010abb0a54 -[SKDisplayLink _callbackForNextFrame:] + 256 
12 QuartzCore      0x000000010ecf0967 CA::Display::DisplayLinkItem::dispatch() + 37 
13 QuartzCore      0x000000010ecf082f CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 315 
14 CoreFoundation     0x000000010b39e4d4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20 
15 CoreFoundation     0x000000010b39e095 __CFRunLoopDoTimer + 1045 
16 CoreFoundation     0x000000010b3613cd __CFRunLoopRun + 1901 
17 CoreFoundation     0x000000010b3609f6 CFRunLoopRunSpecific + 470 
18 GraphicsServices    0x000000010d41d9f0 GSEventRunModal + 161 
19 UIKit       0x00000001098cb990 UIApplicationMain + 1282 

Ve benim sorum neden iOS8 sadece çökmesine yok edilir?

[supers enumerateChildNodesWithName:@"super3" usingBlock:^(SKNode *node, BOOL *stop) { 
.... 
      [supers addChild:super3counter]; //crash here 
}]; 

dispatch_async çok yardımcı oldu: Ben iOS8 içinde enumerate bir sorun ile karşı karşıya

+1

Kök neden hakkında hiçbir bilgim yok, ama 'removeFromParent' örneğiniz için başka bir iyi düzeltmenin bunu 'runAction' için tamamlama bloğuna koymak olduğuna dikkat etmeliydim. Gibi: '[node runAction: [SKAction fadeOutWithDuration: 1.0] tamamlanması:^{[node removeFromParent]; }]; '. –

+0

Bence bu bir çarpışmada bir hareketli çizgiyi kaldırdığımda (en azından benim oyunumda) ve daha sonra sprite kitinin iç öğesi olan “shouldCullNonVisibleNodes” sprite'i kaldırmayı dener ama bellekten kaldırılmış olur. Çocuğumun ebeveynlerini çarpışmadan uzaklaştırırken bunu deneyimliyordum, ama çarpışma devam ediyordu. '- (void) silah (Silah *) silah didCollideWithMonster: (canavar *) canavar { halinde (weapon.parent) { [silah removeFromParent]; } } Kaldırma işleminden önce hareketli grafiğin bir üst bilgisi olup olmadığını kontrol edin, çarpışma birden çok kez çalıştıkça bunu düzeltin. –

+0

Oh evet. Oyun mantığım düğümlerin kaldırılmasını ele aldığım için skView.shouldCullNonVisibleNodes = false; –

cevap

3

(birçok iOS 7.1 testlerinde, düştüğü asla).

Ve hepsine dikkat edin: kilitlenme eşzamanlı olarak gerçekleşmez - yaklaşık 0,5 saniye sürer, ve kod, befro ve sonra da çalıştırılabilir.

+0

Gerçekten de, SpriteKit runloop farklı bir iş parçacığı (muhtemelen ana iş parçacığı) üzerinde çalıştığı için kilitlenme hemen gerçekleşmez, böylece belirtildiği gibi kilitlenmeden önce fazladan kod satırları çalıştırılabilir. – giorashc

+1

Bu durumda kilitlenme noktası nasıl giderilir? Kim eylemleri manuel yorumlama dışında herhangi bir yöntemi biliyor mu? .. :( – djdance

+0

Bunu anladın mı? –