2009-12-16 16 views
6

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

+0

मुझे यह वही समस्या मैटिया है। हर कोई "ololol नक्शा पिन, लीक!" कहना पसंद करता है लेकिन नहीं, एमकेमैप व्यू वास्तव में रैम की भारी मात्रा में घूमता है और यह ज़ूम स्तरों के साथ बदतर हो जाता है। इस समस्या पर अभी काम करना, उम्मीद है कि मुझे कुछ मिल जाएगा। प्रतिक्रिया के लिए –

उत्तर

4

* नोट: यह उत्तर केवल iOS 4.1 और कम करने के लिए प्रासंगिक है। इस उत्तर में वर्णित समस्याओं को ज्यादातर आईओएस 4.2 *

पर कुछ खोद रहा है क्योंकि मेरा ऐप दोनों मानचित्र का उपयोग करता है और इसमें अन्य विशेषताएं भी हैं जो उच्च रैम की मांग करती हैं।

मुझे कोई जवाब नहीं मिला है, लेकिन एक कामकाज है। MKMapView की मेमोरी मांग तेजी से बढ़ती है क्योंकि आप किसी क्षेत्र में नज़दीक ज़ूम करते हैं, और उस क्षेत्र में ज़ूम किए हुए पैन के आसपास पैन करते हैं।

एमकेमैप व्यू टाइल कैश के दो स्तर हैं। एक इंस्ट्रूमेंट्स में मॉलोक ~ 1 9 6 केबी के रूप में खुद को प्रकट करता है, दूसरा अलग-अलग आकारों के एनएसडीटा (स्टोर) है।

मॉलोक सक्रिय उपयोग में आने वाली टाइल प्रतीत होता है, और कितने आवंटित किए जा सकते हैं इस पर एक हार्ड कैप है। मेरे ऐप में यह संख्या 16 है, सुनिश्चित नहीं है कि यह UIView आकार पर आधारित है या नहीं। ये आवंटन कड़ाई से प्रबंधित होते प्रतीत होते हैं, और यह स्मृति चेतावनियों का जवाब देता है।

वैसे भी, एक निश्चित ज़ूम स्तर पर, टाइल के आकार को देखते हुए, महाद्वीप स्तर (एक आईपैड स्क्रीन में उत्तरी अमेरिका के अधिकांश फिट करने के लिए पर्याप्त) कहते हैं, अगर कभी भी वास्तव में कैशिंग के दूसरे स्तर तक नहीं पहुंचना पड़ता है (मानचित्र को पूरा करने के लिए एनएसडीटा (स्टोर))। सब कुछ कुरकुरा और साफ है। अगर मैं सक्रिय छवियों में बाहरी छवियों में से एक टन में लोड करता हूं, तो टाइल्स स्वयं को छीन लेती है। बहुत बढ़िया!

समस्या तब होती है जब यह कैशिंग के दूसरे स्तर को हिट करता है। यह तब होता है जब आप ज़ूम इन करते हैं, और अचानक पूरे प्लानट को दिखाने के लिए 16 टाइल्स की बजाय, इसे लॉस एंजेलस को दिखाने के लिए 16 टाइल्स की आवश्यकता होती है, और जैसे ही आप उन पुरानी टाइल्स को डंप करने के बजाए घूमते हैं, यह उन्हें एनएसडीटा (स्टोर में रखता है)) आवंटन जहां वे कभी मुक्त नहीं होते हैं।

यह एनएसडीटा (स्टोर) NSURLConnectionCache है जो डिफ़ॉल्ट रूप से केवल स्मृति में मौजूद है। आप इसे सीमित करने के लिए इस कैश तक नहीं पहुंच सकते हैं, क्योंकि यह डिफ़ॉल्ट साझा कैश नहीं है (पहले से ही इसे आजमाया गया है)।

तो यह वह जगह है जहां मैं अटक गया हूं।

असंतोषजनक उत्तर यह है कि यदि आप मानचित्र ज़ूमिंग को अक्षम करते हैं और इसे उचित रूप से व्यापक ज़ूम स्तर पर ठीक करते हैं, तो आप इस समस्या से पूरी तरह से बच सकते हैं, लेकिन जाहिर है कि कुछ ऐप्स को इसकी आवश्यकता है ... और यह वही है जहां तक ​​मुझे मिला।

मैंने ऐप्पल के साथ एक समर्थन टिकट दायर किया ताकि यह देखने के लिए कि क्या वे मानचित्र के लिए इस हास्यास्पद कैश को सीमित करने के लिए किसी भी तरह से प्रकट कर सकते हैं (जिस तरह से मैं सक्रिय स्मृति में आवंटित 50+ मेगाहर्ट्ज रैम तक क्रैक करने में सक्षम था) ।

उम्मीद है कि इससे मदद मिलती है।

संपादित

अगले आईओएस रिलीज इस असीम कैश समस्या हल हो जाती है प्रकट होता है। MKMapView अब आक्रामक रूप से अपने कैश किए गए टाइल डेटा को prunes। आनन्द!

+0

जैसा कि आपने बताया है कि यह स्थिति को ठीक नहीं करता है, कम से कम यह एक बहुत अच्छा निदान देता है। परिणाम खोने और परिणामों को साझा करने के लिए धन्यवाद – Mattia

+0

हाय मैटी, मैंने एक संपादन जोड़ा ... आईओएस की अगली रिलीज इस समस्या को हल करती है। –

2

क्या आप अपने एनोटेशन दृश्यों पर पुन: उपयोग पहचानकर्ता सेट कर रहे हैं? (इसका मतलब यह है कि सिस्टम उन विचारों को अलग कर सकता है और केवल एक बार में स्मृति में थोड़ी सी संख्या रखता है। यह स्क्रॉलिंग प्रदर्शन भी बढ़ाता है, क्योंकि स्क्रॉलिंग अलग-अलग विचारों का पुन: उपयोग करेगी।)

एनोटेशन दृश्य प्राप्त करने के लिए इस विधि का उपयोग करें पुनः उपयोग किया जा:

- (MKAnnotationView *)dequeueReusableAnnotationViewWithIdentifier:(NSString *)identifier 
+0

धन्यवाद। मैं वास्तव में एनोटेशन विचारों के लिए पुन: उपयोग पहचानकर्ताओं का उपयोग कर रहा हूं ताकि समस्या न हो, लेकिन मैं सुनिश्चित करने के लिए उन पर फिर से जांच करूंगा। – Mattia

1

यदि आप केवल नक्शाकिट और 768x1024 (आईपैड आकार) के दृश्य आकार के साथ एक ऐप बनाते हैं, तो एप्स इंस्ट्रूमेंट्स आवंटन कार्यक्रम द्वारा रिपोर्ट किए गए "लाइव बाइट्स" के 30+ एमबी से अधिक आसानी से उपभोग कर सकता है। यह आईपैड आईओएस v3.2.2 पर चल रहा था (अगले संस्करण तक 4.2 संस्करण रिलीज होने तक नवीनतम संस्करण)। मेरे शोध से ऐसा लगता है कि यह स्मृति एक ही ऐप के लिए बहुत कुछ है, जहां अधिकांश डेवलपर्स 15-25 एमबी के आसपास स्तर 1 मेमोरी चेतावनी प्राप्त करने की रिपोर्ट करते हैं और उस स्तर के तुरंत बाद दुर्घटनाग्रस्त हो जाते हैं।