2013-06-02 8 views
12

मेरा ऐप एक subview में एक GMSMapView उपयोग कर रहा है, और स्मृति उपयोग इस प्रकार है: मानचित्र का उपयोग करने से पहलेGMSMapView: स्मृति का प्रबंधन कैसे करें?

  • 1,25 एमबी;
  • 21.5 एमबी पहली मानचित्र पहुंच के बाद;
  • 30 MB (और कभी कभी 30 से ऊपर spiking) में जूमिंग और पैनिंग

कोई लीक, जहाँ तक मैं उपकरण के साथ बता सकते हैं के बाद। समस्या यह है कि, मुझे स्मृति चेतावनियां मिल रही हैं, और अक्सर ऐप शटडाउन होती है। जाहिर है, GoogleMaps ऐप की स्मृति के शेर हिस्से का उपयोग कर रहा है। मैं कुछ ऐसा कैसे कर सकता हूं ReceiveMemoryWarning()?

क्या Google मानचित्र को ऐप में रखना संभव है और मेमोरी शट डाउन होने से रोकने के लिए कम से कम पर्याप्त है?

यह GoogleMaps-iOS-1.3.0 है।

अद्यतन:

मेरी स्मृति आंकड़े तरह से बंद कर रहे थे (गतिविधि मॉनिटर के बजाय आवंटन साधन का उपयोग कर गया था)। नक्शा पहुँच

  • 57 एमबी पहला नक्शा पहुँच
  • 65 एमबी के बाद से पहले

    • 8,8 एमबी, 80 एमबी के पास कीलें: यहाँ सही मान रहे हैं।

    यह 256 एमबी रैम डिवाइस (आईपॉड टच 4 जी, उदा।) के लिए "परेशानी" सीमा में स्पष्ट रूप से स्पष्ट है और स्मृति चेतावनियों और कभी-कभी किक बताता है।

    क्या कोई भी 256 एमबी डिवाइस पर किसी ऐप में सफलतापूर्वक Google मानचित्र चला रहा है?

  • +0

    मानचित्र पर स्क्रीन पर नहीं होने पर स्टॉप रेंडरिंग को कॉल करने का प्रयास करें। यह स्मृति संसाधनों को जारी करेगा। – Felix

    +0

    लेकिन जब उपयोगकर्ता स्क्रॉल कर रहा है और ज़ूम कर रहा है, तो क्या करना है, और चेतावनियां आने लगती हैं (और कभी-कभी, शटडाउन)? यानी, प्रतिपादन को रोकने का कोई मौका नहीं है। असल में, क्या ऐप को बस जीएमएसएएम को स्मृति दिवालियापन में चलाने की ज़रूरत है? :-) – user2444264

    +1

    @ user2444264 आपको कोई समाधान मिला, मुझे एक ही समस्या का सामना करना पड़ रहा है –

    उत्तर

    6

    मानचित्र एपीआई टाइल्स का उपयोग करता है जो आकार में 256 x 256 पिक्सेल हैं। ये 32 बिट्स-प्रति-पिक्सेल बनावट के रूप में स्मृति में लोड होते हैं, इसलिए वे 256 x 256 x 4 = 256kb प्रति टाइल का उपयोग करेंगे।

    यदि आपके पास एक आईपैड है जो 1024 x 768 है, तो आपको 4 x 3 = 12 टाइल्स = 3 एमबी की आवश्यकता होगी। हालांकि यह केवल तभी होता है जब आपका विचार टाइल सीमाओं के लिए पूरी तरह से गठबंधन होता है - अभ्यास में यह सीमा पार करेगा, और इसलिए आपको शायद 5 x 4 = 20 टाइल्स = 5 एमबी की आवश्यकता होगी।

    हालांकि यदि आप लगभग उस बिंदु तक ज़ूम आउट करते हैं जिस पर अगले निचले ज़ूम स्तर को प्रदर्शित किया जाएगा, तो प्रत्येक टाइल केवल आधे से अधिक आकार में खींचा जाएगा, और इसलिए आपको 10 x 8 = 80 टाइल्स की आवश्यकता होगी = 20MB।

    फिर यदि आपके पास रेटिना डिवाइस है तो यह वास्तव में अगले उच्च ज़ूम स्तर की टाइल लोड करेगा और इसलिए प्रत्येक आयाम में उनमें से कई की आवश्यकता होती है (स्क्रीन के पिक्सेल से मेल नहीं खाते), और इसलिए आपको 20 x 16 = 320 टाइल्स = 80 एमबी।

    आईफोन 5 के लिए इसी तरह की गणना 240 टाइल्स = 60 एमबी तक काम करती है।

    तो, यदि आप स्मृति की मात्रा की गणना करते हैं, जिसके लिए मानचित्र को केवल टाइल के लिए आवश्यक है, तो आंतरिक प्रसंस्करण के लिए उपयोग किए जाने वाले किसी भी ओवरहेड्स या अन्य मेमोरी की गणना नहीं करते हैं, यह काफी काम करता है। तो संभवतः ऐसा कुछ भी नहीं है जो आप कर सकते हैं। नक्शा एसडीके पहले से ही अप्रयुक्त टाइल्स को मुक्त करता है जब स्मृति दबाव होता है - लेकिन यह वर्तमान दृश्य प्रस्तुत करने के लिए आवश्यक टाइल्स को मुक्त नहीं कर सकता है।

    इसका मतलब है कि आपका एकमात्र विकल्प आपके कोड में स्मृति उपयोग को कम करने के लिए हो सकता है।

    मेरे ऐप के लिए मुझे आईपैड 1 पर जिस तरह से काम करना पड़ा, उसे बदलना पड़ा, क्योंकि यह स्मृति से बाहर हो रहा था और अक्सर क्रैश हो रहा था। अन्य उपकरणों के लिए मैंने पाया कि यह ठीक काम करता है।

    संभावित कामकाज के लिए कुछ विचार नक्शा दृश्य के आकार को कम करने के लिए हो सकते हैं, या ज़ूम स्तर को एक अभिन्न मूल्य पर स्नैप कर सकते हैं। न तो उपयोगकर्ता के लिए बहुत अच्छा होगा, लेकिन वे एक दुर्घटना से बचने में मदद कर सकते हैं।

    +1

    उस विस्तृत उत्तर के लिए धन्यवाद। आप कहते हैं, "मानचित्र एसडीके पहले से ही अप्रयुक्त टाइल्स को मुक्त करता है जब स्मृति दबाव होता है"। मुझे स्मृति चेतावनियों के जवाब में स्मृति उपयोग में कोई भी डुबकी नहीं दिखाई दे रही है। मैं इसे (256 एमबी रैम) आइपॉड टच 4 जी पर परीक्षण कर रहा हूं, और सोचता हूं कि आप सही हैं कि यह तब तक नहीं बनाएगा जब तक कि मैं स्क्रीन आकार को कम नहीं करता। – user2444264

    +0

    निश्चित रूप से जानना मुश्किल है, लेकिन मेरे ऐप में मैं जितनी मेमोरी जारी कर सकता हूं, उतनी मेमोरी जारी करके मेमोरी चेतावनियां संभालता हूं, लेकिन अगर एसडीके संभव हो तो टाइल जारी नहीं कर रहा था, तो मेरा ऐप बहुत नियमित रूप से दुर्घटनाग्रस्त हो जाएगा :) तो मैं मान लीजिए कि यह टाइल्स जारी कर रहा है, लेकिन यह कितनी दूर जा सकती है, इसकी सीमा है, जो अभी भी बहुत कुछ काम करती है। –

    4

    आपके विचार नियंत्रक में इस कोड का उपयोग करने के लिए प्रयास करें:

    - (void)viewWillDisappear:(BOOL)animated{ 
        [super viewWillDisappear:animated] ; 
        [m_mapView clear]; 
        [m_mapView stopRendering] ; 
        [m_mapView removeFromSuperview] ; 
        m_mapView = nil ; 
    } 
    

    मैं इस कोशिश की और यह मुफ़्त ऊपर कुछ GMSMapView स्मृति करता है।

    +0

    यह मेरे लिए काम करता है .. धन्यवाद –

    +0

    मैं स्विफ्ट का उपयोग करता हूं इसलिए मैं ओब्जे-सी से परिचित नहीं हूं, लेकिन मैं इसे एक डेनिट फ़ंक्शन में कॉल करने का सुझाव दूंगा, जो दृश्य नहीं दिखता है। – Rogoon

    +0

    @ रोगून मैं स्विफ्ट से इतना परिचित नहीं हूं, लेकिन मुझे पता है कि 'व्यूविल डिस्प्लेयर()' का उपयोग उसी तरह किया जाता है जैसे ओब्जे-सी में, इसलिए मुझे इसे कहीं और जगह देने का कोई मतलब नहीं दिखता है। – turingtested

    0

    मुझे भी GMSMapview द्वारा उपयोग की जाने वाली विशाल स्मृति के साथ अटक गया है। यह Google मानचित्र sdk के भीतर गंभीर समस्या है और मुझे लगता है कि Google टीम इस पर काम कर रही है। उन्होंने यह भी संस्करण में कुछ स्मृति सुधार के मुद्दों फिक्स्ड 1.9.0 अन्य तरीके दर-

    1. स्मृति को कम संभव

    2. उपयोग नवीनतम संस्करण 1.9.0 के रूप में छोटे रूप में GMSMapView का आकार कम करने के लिए - के रूप में अक्टूबर को 2014

    उपयोग नीचे दिए गए लिंक नवीनतम डाउनलोड करने के लिए sdk-

    https://developers.google.com/maps/documentation/ios/releases

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