2010-02-08 17 views
8

मैपकिट का उपयोग कर मानचित्र पर 500 से अधिक अंक प्लॉट कर रहा हूं। मूल Google मानचित्र ऐप की तुलना में ज़ूमिंग थोड़ा सा झटकेदार है। मैंने पाया है कि धीमापन क्या हो रहा है। मैं कस्टम एनोटेशन जोड़ रहा है, ताकि मैं बाद में विस्तार से विचारों के लिए अलग अलग रंग और पिन बटन जोड़ सकते हैं:टबल्सशूटिंग मैपकिट प्रदर्शन

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(AddressNote *) annotation { 
    MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"currentlocation"]; 
    annView.pinColor = MKPinAnnotationColorGreen; 
    annView.animatesDrop=TRUE; 
    annView.canShowCallout = YES; 
    annView.calloutOffset = CGPointMake(-5, 5); 
    return annView; 
} 

अगर मैं ऊपर कोड बाहर टिप्पणी, सब कुछ ठीक काम करता है। ज़ूम इन/आउट के साथ बहुत चिकनी है। क्या मुझे प्रदर्शन को बढ़ावा देने के लिए अलग-अलग एनोटेशन जोड़ना चाहिए?

उत्तर

1

मुझे लगता है कि मानचित्र के किसी अनुभाग में 500 मानचित्र बिंदु जोड़कर आईफोन स्क्रीन के आकार का कोई मतलब नहीं है। ऐसा कोई तरीका नहीं है कि आप कल्पना कर सकें या दाएं एनोटेशन पर भी क्लिक करें।

क्या आप मानचित्र के ज़ूम स्तर और केंद्र को नहीं देख सकते हैं और फिर मानचित्र पर एनोटेशन का सबसेट जोड़ने का निर्णय ले सकते हैं?

मुझे लगता है कि मैंने अन्य ऐप्स भी ऐसा ही देखा है।

+0

क्या आप समझा सकते हैं कि आप कभी भी आलसी लोडिंग को पूरा करने में सक्षम कैसे होंगे? – user230949

+1

जब भी नक्शा स्क्रॉल करता है तो MKMapView अपने प्रतिनिधि को संदेश भेजता है। हर बार ऐसा होता है, दृश्य के अक्षांश और देशांतर डेल्टा को स्टोर करें ताकि आप मानचित्र की बिक्री जान सकें। मूल्य को संग्रहीत करने से पहले, यह देखने के लिए जांचें कि नक्शा पैमाने बढ़ गया है या एनोटेशन की संख्या समायोजित करने के लिए पर्याप्त रूप से संकुचित है या नहीं। यदि ऐसा है, तो बस विस्तृत गणना का स्तर करें। टिप्पणियों की सूची के माध्यम से भागो और उन सभी को गठबंधन करें जो एक दूसरे की एक निश्चित दूरी के भीतर एक नई एनोटेशन में प्रतिनिधित्व करते हैं। यदि उपयोगकर्ता वापस ज़ूम करता है, तो उसे मूल टिप्पणियों के लिए स्वैप करें। – VictorB

2

मुझे लगता है कि St3fan सही है। सिद्धांत रूप में आप मानचित्र में एनोटेशन जोड़ना जारी रख सकते हैं और दृश्य को उनके प्रदर्शन को प्रदर्शित कर सकते हैं, लेकिन वास्तविकता यह है कि यदि आप गिनती को थोड़ी देर में रखते हैं तो बेहतर होगा, स्क्रीन पर 500 एक बार फिर भी देखने के लिए बहुत सारे तरीके होंगे।

annView.opaque = YES; 
+0

आप इस प्रश्न को गलत समझते हैं। देखने के क्षेत्र में 500 पिन नहीं हैं। केवल कुछ ही हैं। यदि आप काफी दूर ज़ूम आउट करते हैं, तो आप अंततः सभी 500 देखेंगे। AnnView.opaque = हाँ ने मदद नहीं की। – user230949

+0

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

+0

ठीक है, हाँ - मैं सहमत हूं। लेकिन मैं उन्हें कैसे प्रबंधित कर सकता हूं, इसलिए मुझे पता है कि कौन से लोड करना है और कौन लोड नहीं करना है? मेरे सभी बिंदु एक सरणी में हैं। उनके साथ कुछ भी जुड़ा हुआ है जो कहता है कि ये बिंदु देखने वाले क्षेत्र में हैं, उनकी टिप्पणियां लोड करें। ये नहीं हैं, उनकी टिप्पणियां हटा दें। – user230949

6

500 एनोटेशन शायद भी कई इतने सारे कि प्रदर्शन ग्रस्त है, लेकिन नहीं: सुनिश्चित करें कि एनोटेशन विचारों के सभी के लिए अपारदर्शी सेट है हाँ की तरह इतना -

लेकिन वहाँ एक और कदम की कोशिश करने के लिए है जब आप केवल उनमें से कुछ देख रहे हैं। लेकिन, आप अपने एनोटेशन के साथ dequeueing का उपयोग करना चाहिए प्रदर्शन

- (MKAnnotationView *)mapView:(MKMapView *)mapView 
      viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    MKPinAnnotationView *view = nil; 
    if (annotation != mapView.userLocation) { 
     view = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"identifier"]; 
     if (nil == view) { 
      view = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"identifier"] autorelease]; 
     } 
     [view setPinColor:MKPinAnnotationColorGreen]; 
     [view setCanShowCallout:YES]; 
     [view setAnimatesDrop:NO]; 
    } 
    else { 
     // Do something with the user location view 
    } 
    return view; 
} 

इसके अलावा, 500 पिन के साथ सुधार करने के लिए, ड्रॉप एनीमेशन एक लंबे समय के खत्म करने के लिए ले जाता है। आपको [view setAnimatesDrop:NO]

+2

धन्यवाद लेकिन डेक्यूइंग किसी भी प्रदर्शन में मदद नहीं करता है। मुझे पता है कि एनोटेशन की बड़ी संख्या प्रदर्शन को प्रभावित कर रही है। मैं 100 तक कम कर सकता हूं और अच्छा प्रदर्शन कर सकता हूं। जब नक्शा देखने का क्षेत्र बदलता है, तो मुझे देखने वाले बिंदुओं के लिए एनोटेशन लोड करने का एक तरीका चाहिए। आलसी लोडिंग की आवश्यकता है लेकिन मैपकिट उस प्रकार की चीज़ के लिए अनुकूल नहीं है। – user230949

+2

Dequeueing प्रदर्शन में मदद करता है, आप इसका उपयोग क्यों करेंगे?"एनोटेशन विचारों का पुन: उपयोग इस समय महत्वपूर्ण संचालन के दौरान नई दृश्य वस्तुओं के निर्माण से परहेज करके स्क्रॉलिंग के दौरान महत्वपूर्ण प्रदर्शन सुधार प्रदान करता है।" http://developer.apple.com/iphone/library/documentation/MapKit/Reference/MKAnnotationView_Class/Reference/Reference.html –

3

के साथ इसे बंद करना चाहिए मैंने क्लाइंट के लिए एक आईफोन ऐप लिखा था और हमने अपने स्टोर ब्रांड्स में से एक के लिए स्टोर लोकेटर भी शामिल किया था। इसमें 501 स्थान शामिल हैं और जब आप पूरे संयुक्त राज्य को देखने के लिए ज़ूम आउट करते हैं तो एनीमेशन थोड़ी झटकेदार हो सकता है, यह राज्य स्तर पर पूरी तरह से ठीक है, जहां केवल कुछ मुट्ठी भर पिन दिखाई दे रहे हैं।

कुंजियाँ:

  • ज़ूम अपने वर्तमान स्थान में उपयोगकर्ता से पहले आप अपनी टिप्पणियों को जोड़ें।
  • dequeueReusableAnnotationViewWithIdentifier: का उपयोग करके एनोटेशन दृश्यों का पुन: उपयोग करें।

पहला बिंदु प्राप्त करने के लिए, आपको स्थान अपडेट चालू करने और पहली बार प्राप्त होने पर ध्वज सेट करने की आवश्यकता है। एक क्षेत्र अवधि का उपयोग करके उस स्थान पर मानचित्र को एनिमेट करें जो आपके ऐप के लिए समझ में आता है, फिर mapView:regionDidChangeAnimated: में, यह देखने के लिए जांचें कि क्या आपको अभी भी और जोड़ने की आवश्यकता है कि addAnnotation: पर कॉल करने से पहले वर्तमान स्थान अपडेट किया गया है।

यदि आप उपयोगकर्ता के स्थान पर ज़ूम इन नहीं करना चाहते हैं या नहीं, तो क्या आप उच्चतम स्तर पर दिखाए गए एनोटेशन को फ़िल्टर कर सकते हैं और केवल उपयोगकर्ता के रूप में अतिरिक्त एनोटेशन जोड़ सकते हैं?

वैसे, मुझे विश्वास है कि ऊपर दिए गए अनुसार आपके कोड में मेमोरी लीक है।भले ही आप डेक्यूइंग तंत्र का उपयोग नहीं करना चाहते हैं, फिर भी आप mapView:viewForAnnotation: से वापस आने वाले दृश्य को स्वत: बंद कर दिया जाना चाहिए।

1

यदि आप उपयोगकर्ता द्वारा देखे गए एनोटेशन को नहीं हटा रहे हैं, तो MKMapViewDelegate के माध्यम से ऐसा करना एक बात है। यदि देश स्तर पर उपयोगकर्ता ज़ूम आउट करते समय प्रदर्शन खराब हो रहा है तो आप ज़ूम स्तर> समेकित मूल्य पर समेकित जानकारी प्रस्तुत करना चाहेंगे, उदा। 10 वर्ग मील के भीतर 30 एनोटेशन के बजाय [30 something] जैसे एकल एनोटेशन दिखाएं।

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