2013-10-18 11 views
6

मुझे निम्न स्टैक ट्रेस के साथ एक बग रिपोर्ट प्राप्त हो रही है और मुझे नहीं पता कि समस्या क्या है। मैंने सुझावों को देखा है कि यह एक बनावट एटलस में एक एमिटर की छवि होने या उसी रन लूप में एक एमिटर को हटाकर किया जा सकता है क्योंकि यह जोड़ा जाता है लेकिन मुझे नहीं लगता कि इनमें से कोई भी हो रहा है। यह एक छद्म मुद्दा है और मैं इसे फिर से नहीं बना सकता। मैं इसे केवल बग रिपोर्ट में देखता हूं। मुझे किसी भी मदद से प्यार होगा।स्प्राइट किट में 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 

संपादित करें: मैं अब साकार कर रहा हूँ कि मैं emitters के साथ हमेशा कुछ अलग स्थितियों में SKSpinLockSync समस्या हो और नहीं। मुझे लगता है कि एमिटर के साथ अक्सर इसे देखने का एकमात्र कारण यह है कि ऐप में छवि लोडिंग का शेर हिस्सा है, इसलिए यह केवल सांख्यिकीय रूप से सबसे अधिक संभावना है। स्टैक ट्रेस की शीर्ष चार पंक्तियां हमेशा समान होती हैं। तो, [SKTexture Size] तक और सहित।

उत्तर

2

OSSpinLock मल्टीथ्रेड किए गए ऐप्स में परमाणु संचालन सुनिश्चित करने के लिए एक तंत्र है।

मुझे नहीं लगता कि यहां एक बहुभाषी समस्या है, लेकिन लोड ImageData ने उस डेटा को प्रदान किया हो जो काम के परमाणु भाग के दौरान दुर्घटनाग्रस्त हो। यह बंडल में एक लापता (या भ्रष्ट या असमर्थित फ़ाइल प्रारूप) बनावट के कारण हो सकता है। यह निश्चित रूप से एक उत्सर्जक है जो बनावट लोड विफल होने का कारण बनता है।

कुछ समय के लिए रिलीज कॉन्फ़िगरेशन (योजना संपादित करें) में अपने ऐप का परीक्षण करने का प्रयास करें। रिलीज में केवल कुछ बग्स ऑप्टिमाइज़ेशन सक्षम हैं। आप अपने ऐप का एक एडहोक संस्करण भी बना सकते हैं और इसे अपने डिवाइस पर तैनात कर सकते हैं और इसका परीक्षण कर सकते हैं। आपका पहला लक्ष्य अभी अपने डिवाइस पर समस्या को सत्यापित करना चाहिए, अन्यथा पिन करना मुश्किल हो सकता है।

कॉल स्टैक आपको कुछ संकेत देता है: समस्या एक एमिटर के साथ है जो एक स्प्राइट का बच्चा है जो एक अन्य स्प्राइट का बच्चा है जो दृश्य का बच्चा है। शायद यह इसे कम कर देता है।

+0

के लिए विकास कर रहा हूं यह मेरी समस्या का समाधान नहीं करता है, लेकिन यह मुझे इसकी तलाश करने के लिए कुछ लीड देता है। धन्यवाद। – Kardasis

0

मुझे स्प्राइटकिट का उपयोग करके गेम बनाने में भी एक ही समस्या थी। इंटरनेट खोज से प्राप्त होने वाली सभी पोस्टिंग समाधान के लिए शून्य थीं। कभी-कभी, एक विशेष क्रिया प्रकार इस समस्या का कारण बनता है, न कि भ्रष्टाचार या बंडल में लापता बनावट से यदि कार्रवाई में मल्टीथ्रेडिंग की अवधारणा है। और मैंने इसे हल किया! दूसरे शब्दों में, अप्रत्यक्ष रूप से आपके कोड में बहु-थ्रेडिंग का एक प्रकार हो सकता है, भले ही कोई स्पष्ट मल्टी-थ्रेड न हो।

0

स्प्राइट किट में कणों के साथ मुझे यह सटीक समस्या (एक ही क्रैश लॉग स्टैक) थी। मैंने कई घंटों में कई चीजों की कोशिश की - और आखिरकार इसे समझ लिया, सॉर्टा: ऐसा प्रतीत होता था क्योंकि स्रोत बनावट एक बनावट एटलस फ़ोल्डर में थी, और इसमें संबंधित @ 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 आईओ से संबंधित हो सकता है और यदि आप अक्सर अपने गेम में हर फ्रेम की तरह ऐसा करते हैं तो यह क्रैश हो सकता है, या एसकेटेक्चर कैश सिस्टम से आने वाली समस्या में समस्या है जब इसे बनावट डेटा की आवश्यकता होती है और लोड लोड करें ImageData गैर-थ्रेड सुरक्षित में।

तो मैं प्रति के साथ 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:] 

मैं अनिश्चित हूँ क्या कारण था, लेकिन मेरी कूबड़ यह बनावट पहले से लोड नहीं किया जा रहा से कोई लेना देना नहीं है। विधि के लिए प्रलेखन इस बात की कोई अंतर्दृष्टि प्रदान नहीं करता है कि उन्हें प्रीलोड किया जाना चाहिए या नहीं, इसलिए यह पूरी तरह से अनुमान लगाया गया है, लेकिन जो मैं इकट्ठा करता हूं उससे स्प्राइटकिट चॉकिंग प्रतीत होता है क्योंकि यह छवियों को प्रदर्शित करने के लिए पर्याप्त तेज़ी से लोड नहीं कर सका।

किसी भी मामले में

, [SKTexture preloadTextures:... का उपयोग कर मेरी दुर्घटना का समाधान करता है पूरी तरह से

आशा है कि यह भी आप और अन्य लोगों में मदद करता है!

0

यदि SKEmitterNode का उपयोग कर रहे हैं और एक ही समय में एक से अधिक समय (एक ही समय के करीब) बनाते हैं, तो मेरा गेम अभी भी दुर्घटनाग्रस्त हो गया है। मुझे मैन्युअल रूप से प्रीलोड करना था (दृश्य में एमिटर बनाना और जोड़ना), तब तक मैं क्रैशिंग को रोकने में सक्षम था, मुझे कण प्रभाव को बनाने और दृश्य में जोड़ा जाना था और इसे अपनी क्रिया को चलाने देना था। मैं इसे छिपाने के लिए कण अल्फा 0 पर सेट करता हूं। तब तक मैं निराशा से था, मैंने सब कुछ preloaded।

ऊपर SKEmitterNode और getEmitter विधि का उपयोग करके, मैं अभी भी क्रैश हो रहा हूं जब मैं एक ही समय में 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 पर पॉइंटर छोड़ दिया। ऐप "एनीमेशन" कार्यों के एक जटिल सेट के बीच में दुर्घटनाग्रस्त हो गया। आर। रैंडज़ो की तरह उनकी पोस्ट में उल्लेख किया गया है, आलसी छवि लोडिंग इन समस्याओं का कारण बन सकती है। लेकिन मेरे सभी एनिमेशन प्रीलोडेड छवियों का उपयोग कर रहे हैं। आखिर में मैंने एक आलसी लोडिंग छवि "छाया में छिपाने" की खोज की, जो मेरे एनीमेशन अनुक्रम और उपयोगकर्ता इंटरैक्शन के परिणामस्वरूप प्रस्तुत होने का इंतजार कर रहा था। इस छवि को प्रीलोड करने के बाद भी, SKSpinLockLock भूत चला गया था। N.B.मैं आईओएस 7 +

संबंधित मुद्दे