2009-10-23 15 views
5

कोर एनीमेशन पृष्ठभूमि के धागे का उपयोग करता है ताकि यह काम कर सके। अब समस्या यह है: मेरे पास मुख्य धागे में भारी गणना चल रही है। जब तक गणना पूरी नहीं हो जाती तब तक कोर एनीमेशन तुरंत जमा हो जाता है। और फिर यह अपने एनिमेशन खत्म करना जारी है। मुझे एक दस्तावेज़ में पढ़ना याद है कि सीए की प्रसंस्करण समय में कम प्राथमिकता है, जिसका अर्थ है कि जो भी मुख्य धागा करना चाहता है वह उच्च-प्राइयो है और एक ही समय में किसी भी फैंसी एनीमेशन की तुलना में अधिक संभावना होगी।क्या कोर एनीमेशन को इसके धागे को चलाने के लिए मजबूर करने का कोई तरीका है?

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

सीए को काम करने के लिए कैसे मजबूर किया जा सकता है? अगर चीजें थोड़ी धीमी हो जाती हैं, तो यह ठीक है। लेकिन सबसे महत्वपूर्ण बात ये है कि सभी चीजें उपयोगकर्ताओं के दृष्टिकोण से चलती रहती हैं।

उत्तर

5

मुख्य धागे पर भारी गणना न करें, क्योंकि वे यूआई को अवरुद्ध करेंगे और खराब उपयोगकर्ता अनुभव का नेतृत्व करेंगे। उन्हें पृष्ठभूमि धागे में चलाएं।

उस ने कहा, आईफोन एक एकल कोर सिस्टम है, इसलिए यदि गणना एक थ्रेड में सीपीयू को घुमा रही है, तो हर दूसरे धागे का प्रदर्शन निकट रुकावट में हो सकता है। यदि आप कर सकते हैं, तो अपनी गणना को छोटे तत्वों में तोड़ने और NSOperationQueue में NSOperations के रूप में चलाने का प्रयास करें। यदि आप सुनिश्चित करते हैं कि गणना सेगमेंट इतने छोटे नहीं हैं कि उनके लिए एनएसओपरेशन बनाने का ओवरहेड बहुत बड़ा हो जाता है, तो यह गणना को थोड़ा सा थ्रॉटल करने का माध्यम प्रदान कर सकता है ताकि आपके एनिमेशन को धीमा नहीं किया जा सके।

कोर एनीमेशन एक एनीमेशन चलाने से पहले कई गणनाओं को आगे बढ़ाने के लिए जाता है, इसलिए वे आपके भारी गणना थ्रेड से धीमा हो सकते हैं। आप -animationDidStart के भीतर अपनी भारी गणना शुरू करने में भी सक्षम हो सकते हैं: आपके CAAnimation के लिए प्रतिनिधि विधि, एनीमेशन प्रगति पर होने पर गणना केवल तभी बंद हो जाती है। मेरा मानना ​​है कि एनीमेशन की प्रगति इसकी शुरुआत की तुलना में कम गणना का उपयोग करती है, इसलिए यह आपकी भारी गणना के साथ सह-अस्तित्व में सक्षम हो सकती है।

+0

धन्यवाद। NSOperations टाइमआउट बनाने में सक्षम है? मेरी गणना पहले ही टुकड़ों में टूट गई है। प्रत्येक को 0.05 सेकंड की देरी के साथ निर्धारित किया जाता है। तो वास्तव में कुछ अतिरिक्त समय के बीच में है। हालांकि, जब सीए को शुरुआत में सटीक करना पड़ता है, तो आपके द्वारा प्रतीक्षा करने का विचार -निमेशनडिडस्टार्ट गुग है। मैंने 1 सेकंड के साथ गणना के पहले ब्लॉक से शुरू करने के लिए कॉल में देरी करके बस कोशिश की। सीए एनिमेटिंग शुरू होता है, फिर भारी calclations जगह में आते हैं, और सीए फ्रीज। यह मदद नहीं करता है। मैं एक नए धागे में गणना चला रहा हूँ। –

+0

बिंदु यह है कि डेटा के प्रत्येक ब्लॉक की गणना करने के बाद, यूआई में एक अपडेट हो रहा है। ये अपडेट अपेक्षाकृत तेज़ और चिकनी होते हैं। यह बिल्कुल सही होगा जब इस तरह से इस तरह से शेड्यूल करने का कोई तरीका था कि सीए इस समय सीपीयू का समय साझा करता है ... इन NSOperationQueue चीजों पर नज़र डालने के लिए, हालांकि वे ऐसा नहीं लगता जैसे वे टाइमआउट प्रदान करेंगे देरी प्रदर्शन प्रदर्शनकर्ता कॉल करते हैं (?) –

+0

NSOperationQueue आपके NSOperations के लिए आवश्यकतानुसार धागे बनाता है।यह प्रबंधित करने के बारे में बुद्धिमान है कि कौन से कार्यों का प्रदर्शन किया जाता है, लेकिन मुझे नहीं पता कि आईफोन पर यह किस प्रकार की सिस्टम-स्तरीय जागरूकता है, जो हिम तेंदुए पर है (जहां यह जीसीडी के शीर्ष पर है)। यह कार्यों के बीच निर्भरताओं का भी समर्थन करता है, जिन्हें आप यहां अपने लाभ के लिए उपयोग करने में सक्षम हो सकते हैं। –

-1

मुझे यकीन नहीं है, लेकिन आप [NSThread setThreadPriority:1.0] पर कॉल करने का प्रयास कर सकते हैं यदि आप अपने सीए को किसी अन्य थ्रेड में चलाते हैं।

+0

ले यह फर्क पड़ता है अगर मैं एक और धागा में सीए कहते हैं? जहां तक ​​मुझे पता है, सीए इस तरह की चीजों के लिए अपनी प्रक्रिया और धागा रखता है (या कम से कम इसका खुद का धागा, बहुत कम प्राथमिकता सेटिंग के साथ) –

7

आप [CATransaction flush] उपयोग कर सकते हैं कोर एनीमेशन फ्लश करने के लिए यदि आप न दें runloop अपने पाठ्यक्रम

+0

हालांकि यह केवल आईओएस 4.0 और ऊपर की तरफ काम करता प्रतीत होता है। इससे पहले यह ठीक से रेड्रो को मजबूर नहीं करता है, लेकिन किसी भी समस्या का कारण बनता है। – monkeydom

+0

मुझे पता है कि यह पुराना है, लेकिन क्या आप विस्तार से ध्यान देंगे कि '[CATransaction फ्लश]' थ्रेडिंग समस्या के साथ कैसे मदद करता है? – Warpling

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

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