2012-07-17 16 views
10

मैं अपने अनुभव को UIViews पर self.layer.shouldRasterize = YES; ध्वज का उपयोग करने से साझा करना चाहता हूं।UIView self.layer.shouldRasterize = हाँ और प्रदर्शन समस्या

मैं एक UIView वर्ग पदानुक्रम है कि self.layer.shouldRasterize स्क्रॉल प्रदर्शन में सुधार करने के पर कर दिया (उनमें से सभी स्थैतिक subviews कि डिवाइस की स्क्रीन से बड़े होते हैं है) है।

आज उप-वर्गों में से एक में मैंने अच्छे कण प्रभाव उत्पन्न करने के लिए CAEmitterLayer का उपयोग किया। हालांकि कणों की संख्या वास्तव में कम (50 कण) था

प्रदर्शन वास्तव में गरीब है।

इस समस्या का कारण क्या है?

उत्तर

10

बंद करना self.layer.shouldRasterize सामान्य स्तर पर प्रदर्शन बढ़ाता है।

वह क्यों है?

सेब के डेवलपर्स साइट पर एक वीडियो के अनुसार (मुझे वीडियो याद नहीं है, कृपया मदद करें?) Self.layer.shouldRasterize के लिए नियम इतना आसान है: यदि आपके सभी सबव्यू स्टेटिक हैं (उनकी स्थिति, सामग्री इत्यादि हैं) बदलना या एनिमेटिंग नहीं करना) तो यह self.layer.shouldRasterize चालू करने के लिए लाभार्थी है। दूसरी तरफ यदि कोई सबव्यू बदल रहा है तो फ्रेमवर्क को दृश्य पदानुक्रम को फिर से कैश करने की आवश्यकता है और यह एक बड़ी बाधा है। हुड के तहत बाधा सीपीयू और जीपीयू के बीच स्मृति की प्रतिलिपि है।

31

मैं सिर्फ बोली जाएगा एप्पल डॉक्टर और व्याख्या करते हैं:

@property BOOL shouldRasterize 

जब इस संपत्ति के मूल्य हाँ है, परत अपने स्थानीय समन्वय अंतरिक्ष में एक बिटमैप के रूप में प्रदान है और उसके बाद के लिए सम्मिश्रित किसी भी अन्य सामग्री के साथ गंतव्य। फ़िल्टर प्रभाव में छाया प्रभाव और फ़िल्टर रास्टरकृत हैं और बिटमैप में शामिल हैं। हालांकि, परत की वर्तमान अस्पष्टता rasterized नहीं है। यदि रास्टराइज्ड बिटमैप को कंपोजिटिंग के दौरान स्केलिंग की आवश्यकता होती है, तो minification में फ़िल्टर फ़िल्टर और आवर्धन फ़िल्टर गुण आवश्यकतानुसार लागू होते हैं।

तो मूल रूप से जब कंधे को यस पर सेट किया जाता है, तो प्रत्येक पिक्सेल जो परत को लिखता है उसकी गणना की जाती है और पूरी परत को बिटमैप के रूप में कैश किया जाता है।

  • इससे आपको कब फायदा होगा?

जब आपको केवल इसे एक बार आकर्षित करने की आवश्यकता होती है। इसका मतलब है कि जब आपको केवल शुद्ध "सरल" एनीमेशन की आवश्यकता होती है (जैसे चलना, परिवर्तन करना, स्केलिंग ...) क्योंकि कोरएनीमेशन वास्तव में उस फ्रेम का उपयोग प्रत्येक फ्रेम को दोबारा बिना किए बिना करेगा। CoreAnimation के साथ संयुक्त जटिल परतों (छाया और कोने त्रिज्या के साथ) को कैश करने के लिए यह एक बहुत ही शक्तिशाली विशेषता है।

  • यह आपको फ्रेमरेट कब मार देगा?

जब आपके परत है पुन: प्रदर्शित कई बार, क्योंकि ड्राइंग है कि पहले से ही लागू होने वाली, shouldRasterize बिटमैप डाटा को कैश करने के लिए सभी पिक्सल पर कार्रवाई करेंगे की चोटी पर।

तो असली सवाल आपको खुद से पूछना चाहिए: "मैं किस परत पर shouldRasterize को हाँ में लागू कर रहा हूं? और यह परत कितनी बार फिर से खींची जाती है?"

आशा है कि यह पर्याप्त स्पष्ट था।

+1

मैं आईओएस के लिए नया हूं। तो क्या चाहिए अगर मैं इसे कस्टम UITableViewCells के लिए उपयोग करता हूं तो अच्छा है? रास्ते से इस महान जवाब के लिए धन्यवाद। :) @apouche – GangstaGraham

+2

मैं सबसे ज्यादा नहीं कहूंगा, यूआईटीबल व्यूसेल को दो कारणों से रास्टराइज करना अच्छा नहीं है: 1. यदि आप पुन: उपयोग पहचानकर्ता का उपयोग करते हैं, तो स्क्रॉलिंग के दौरान टेबलव्यू सेल कई बार फिर से खींचा जाएगा (और इसलिए कंधा इसे और भी दंडित करें)। 2: आप इससे लाभ नहीं उठाएंगे क्योंकि UITableViewCell को एनिमेट करना बहुत असामान्य है। – apouche

+0

@apouche प्रतीक्षा करें, क्या आप स्केलिंग करते समय कंधे का उपयोग करने के लिए कह रहे हैं? क्या वह बिटमैप कैश को स्केल नहीं करेगा और उसके परिणामस्वरूप बदसूरत दिखने वाली छवि में? (उदाहरण के लिए स्केलिंग?) –