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
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]; }]; '. –
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. –
Oh evet. Oyun mantığım düğümlerin kaldırılmasını ele aldığım için skView.shouldCullNonVisibleNodes = false; –