2012-01-11 12 views
8

यह वास्तव में किसी विशिष्ट समस्या को हल करने के बारे में कोई प्रश्न नहीं है बल्कि सही दिशा में इंगित करने का अनुरोध अधिक है।UIImageView बनाम UIView w/छवि - दक्षता

मैं एक ऐप बना रहा हूं जहां मैं एक ही समय में एक स्क्रीन पर कई छवियों (जेपीजी के रूप में सहेजा गया) लोड कर रहा हूं और यह वही तरीका है, मैं उनमें से किसी को भी उतार नहीं सकता क्योंकि वे सभी एक बार में दिखाया गया।

मैंने लगभग 800px * 600px संकल्प पर 30 छवियों को लोड करने की कोशिश की है, यह सोचकर कि यह केवल चित्रों के 'संपीड़ित' आकार को स्मृति में लोड करता है (यह लगभग 200 केबी है) - तो कुल 6 एमबी? बेशक, बाद में कई स्मृति चेतावनियां, मुझे एहसास हुआ कि मैं कितना बेवकूफ था। तो अब मैं उन्हें लगभग 400px * 300px प्रत्येक और मेरे आईफोन 4 एस को बस स्मृति आवश्यकताओं के साथ copes के आकार में आकार देता हूं।

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

इस तरह की 'खोजों' ने मुझे काम करने के लिए घंटों का समय निकाला है और मैं क्या सोच रहा था कि यदि विशेष डिजाइन पैटर्न या संसाधन हैं जो मैं स्क्रीन पर अपनी छवियों को यथासंभव कुशलता से लोड करने के लिए उपयोग कर सकता हूं; मुख्य रूप से जितना संभव हो उतना कम स्मृति का उपयोग करने के संबंध में - क्या अंगूठे के अच्छे नियम हैं? UIImageView बनाम UiView w/image का उपयोग क्यों किया गया इतना अंतर है?

कोई भी मदद कर सकता है तो बहुत आभारी होंगे।

धन्यवाद।

उत्तर

9

कार्यान्वयन -drawRect: सिस्टम को आपके दृश्य के समान आकार की बिटमैप छवि आवंटित करने का कारण बनता है (आखिरकार, आपको इसमें बफर करने की आवश्यकता है)। यदि आप जो भी कर रहे हैं वह एक ऐसी छवि खींचना है जिसे आप पहले ही लोड कर चुके हैं, तो एक में झुकाव में आप उस छवि के लिए स्मृति उपयोग को दोगुना कर चुके हैं (क्योंकि आपके पास कॉपी की गई प्रतिलिपि है, और दूसरी प्रतिलिपि जिसे आपने अभी खींचा है)।

इसी तरह, परतों को रास्टराइज़ करने के लिए परत के समान आकार को बिटमैप छवियों को आवंटित करने की आवश्यकता होती है, इसलिए इसमें रास्टरराइज करने के लिए एक बफर होता है। तो इसे चालू करने के साथ-साथ स्मृति के बेकार (परत के आकार के आनुपातिक) को चालू करना।

अंगूठे का मूल नियम है, अतिरिक्त काम न करें। एक छवि खींचने के लिए -drawRect: का उपयोग करना अतिरिक्त काम है। एक परत को रास्टराइज करना अतिरिक्त काम है (हालांकि, परत के आधार पर, यह बाद में प्रदर्शन को बचाने के लिए एक बार प्रदर्शन लागत (और एक निरंतर स्मृति लागत) हो सकती है, उदाहरण के लिए यदि यह CAShapeLayer है या यदि यह छाया खींच रहा है)। बड़ी छवियों को स्मृति में रखना जो आप स्क्रीन पर प्रतिपादन करने से पहले हमेशा स्केल करते हैं, अतिरिक्त काम होता है (जब आप छवि लोड करते हैं तो इसे स्केल करें, और स्केल की गई प्रतिलिपि को चारों ओर रखें)।

ध्यान रखने योग्य एक और बात यह है कि यदि आपका लक्ष्य छवियों को आकर्षित करना है, तो आपको UIImageView का उपयोग करने की कोशिश करनी चाहिए यदि आप संभवतः कर सकते हैं। स्क्रीन पर एक छवि प्राप्त करने के लिए यह आमतौर पर सबसे तेज़ और सबसे सस्ता तरीका है, और यह उचित रूप से लचीला है।

8

डिजाइन पैटर्न मूल रूप से है, UIImageView का उपयोग करें। ऐप्पल ने इसे तेजी से बनाने में काफी समय बिताया है, और ऐप्पल को निजी एपीआई का उपयोग करने की इजाजत है जो आप नहीं हैं।

यह कहा गया कि, यदि आप इसे स्वयं करना चाहते हैं, तो आपको प्रति छवि CALayer का उपयोग करने का प्रयास करना चाहिए। आप बस एक छवि लोड करते हैं और की content संपत्ति के रूप में सेट करते हैं। CALayer GPU मेमोरी में इसकी सामग्री को कैश कर सकता है, और अन्य अनुकूलन भी कर सकता है जो आप सार्वजनिक एपीआई के साथ नहीं कर सकते हैं।

आप ऐप्पल के विकास वीडियो देखकर अपना यूआई तेजी से बनाने के बारे में बहुत कुछ सीख सकते हैं। उनमें बहुत सारी युक्तियां और "अंदरूनी जानकारी" शामिल हैं जो या तो लिखित दस्तावेज़ीकरण में नहीं हैं, या दस्तावेज़ों में अनदेखा करने में आसान/ढूंढना मुश्किल है। विकास वीडियो यहां हैं: http://developer.apple.com/videos/। अपने प्रश्न के लिए प्रासंगिक कुछ अच्छे:

  • आईओएस - "समझौता आईओएस देखें सम्मिश्रण"
  • WWDC 2011 - "समझौता UIKit प्रतिपादन"
  • WWDC 2011 - "आईओएस डेवलपर्स के लिए प्रैक्टिकल आहरण"
  • WWDC 2011 - "कोर एनिमेशन अनिवार्य"
  • WWDC 2010 - लिंक के लिए "अभ्यास में कोर एनिमेशन"
+1

धन्यवाद - वे बहुत उपयोगी थे। – Vazzyb

+2

+1 ऐप्पल से कुछ वीडियो सुझाए जाने के लिए +1 (विशेष रूप से जब से उन वीडियो को खोजने और देखने के लिए ऐप्पल का इंटरफ़ेस भयानक है!) –

+0

@ केविनज़िच ने कभी भी [asciiwwdc.com] (http://asciiwwdc.com) का उपयोग किया है? – Honey