2012-04-03 21 views
27

तो मैं अपने नेविगेशन नियंत्रक पर कुछ कस्टम एनिमेशन कर रहा हूं और जिस तरह से यह दृश्य नियंत्रकों को धक्का देता है और पॉप करता है।कैलियर - छाया एक प्रदर्शन हिट का कारण बनता है?

सबकुछ सुचारू चलता है। जैसे ही मैं निम्नलिखित कोड जोड़ता हूं (UINavigationController के उप-वर्ग में), मुझे एक विशाल प्रदर्शन हिट का सामना करना पड़ता है। छाया जोड़ने के बाद सभी एनिमेशन बहुत कमजोर हो जाते हैं। क्या यह उम्मीद है या मैं कोड में कुछ गलत कर रहा हूँ?

// This code gets called once during NavigationController initialization. 
[self.view setClipsToBounds:NO]; 
[self.view.layer setCornerRadius:5]; 
[self.view.layer setShadowOffset:CGSizeMake(0, 20)]; 
[self.view.layer setShadowColor:[[UIColor yellowColor] CGColor]]; 
[self.view.layer setShadowRadius:20.0]; 
[self.view.layer setShadowOpacity:1]; 

संपादित करें:

1 करने के लिए मेरा साया त्रिज्या बदल दिया और यह अभी भी धीमी है

+0

सब इसके लायक है के लिए, यह WWDC 2010 सत्र 425 में स्पष्ट रूप से कवर किया जाता है: इस पोस्ट

theView.layer.shadowPath = [UIBezierPath bezierPathWithRect:theView.bounds].CGPath; 

चेक अभ्यास में कोर एनिमेशन, भाग 2 (https://developer.apple [यहाँ।] .com/devcenter/download.action? path =/videos/wwdc_2010__sd/session_426__core_image_effects_and_optimization.mov) –

उत्तर

39

आपको एक छाया जोड़ने से मंदी की उम्मीद करनी चाहिए। 20 का shadowRadius बहुत अधिक है और विशेष रूप से धीमा होगा।

छाया प्रतिपादन गति में सुधार करने की दूसरी कुंजी: shadowPath संपत्ति सेट करें। यह नाटकीय रूप से मदद कर सकता है।

+0

सेटिंग छायापैथ ने चाल की, मेरी छाया त्रिज्या 10 है और यह अभी भी अच्छी तरह से प्रदर्शन करती है। – aryaxt

+0

ने अभी अपना जीवन बचाया :) –

+2

@ निकोलसमांज़ीनी छाया प्रदर्शन के लिए अधिक टिप्स: http://stackoverflow.com/questions/10133109/fastest-way-to-do-shadows-on-ios/10133182#10133182 – aryaxt

2

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

+0

आपको लगता है कि यह वास्तविक पीएनजी का उपयोग करने और इसे मेरे UIView में जोड़ने के लिए बेहतर प्रदर्शन करेगा? – aryaxt

+0

यदि यह एक संभावना है (यानी आप आकृति/आकार/जो भी छाया पहले से जानते हैं) तो यह निश्चित रूप से आपको बेहतर प्रदर्शन देगा। चमकती छवियां छाया को प्रतिपादित करने से कहीं अधिक तेज होती हैं। –

+0

एक छवि को पहले से प्रस्तुत किया जाएगा जब तक कि आपको छाया आकार बदलने की आवश्यकता नहीं है। –

79
self.view.layer.shouldRasterize = YES; 
self.view.layer.rasterizationScale = UIScreen.mainScreen.scale; 

मैं हाल ही में धीमी गति से CALayer छाया के साथ कुछ समस्याएं हो रही थी, और कोड की है कि सरल रेखा मेरे लिए सब कुछ तय!

+0

कमाल, यह इसे और भी बेहतर प्रदर्शन करता है, अब मेरे पास प्रदर्शन हिट – aryaxt

+21

के बिना छाया रेडियस का कोई आकार हो सकता है यह आपके लिए एनोटेशन के लिए रेटिना छवियों को अनदेखा कर देगा। इसे ठीक करने के लिए, निम्न पंक्ति जोड़ें: self.view.layer.rasterizationScale = [UIScreen मुख्यस्क्रीन]।पैमाने; – Sean

+2

मुझे एक टेबल व्यू के साथ एक समान समस्या है जहां प्रत्येक सेल में कुछ UILabels के साथ-साथ गोलाकार कोनों के साथ एक दृश्य होता है। मैंने परत में एक छाया जोड़ दी जिसमें तालिका दृश्य है और स्क्रॉलिंग चंचल हो जाती है। हालांकि, सेटिंग करना चाहिए = YES ने चापलूसी को हल किया लेकिन दृश्य को पिक्सेललेट किया (स्पष्ट रूप से धुंधला) तो यह एक स्वीकार्य समाधान नहीं है। मैंने shadowOffset की बजाय छायापाथ का उपयोग करके पाया कि चाल है। –

13

के बजाय shadowPath का उपयोग करना। iphone - Animation's performance is very poor when view's shadow is on

+0

एक आकर्षण की तरह काम किया, कंधे से बेहतर, जो दृश्य और सभी sublayers धुंधला हुआ। –

+1

यह बहुत ही कुशल तरीका है कि मैं परीक्षण करता हूं ... कंधे के साथ विचार करना इतना तेज़ नहीं है जितना कि इसकी आवश्यकता हो सकती है। यह जवाब बहुत बेहतर है! समझ में नहीं आता क्यों @ विल्लियमकटन का जवाब इतना वोट प्राप्त करता है ... –

+0

छायापाथ बहुत अच्छा और तेज़ है, लेकिन ऑटोलायआउट में अद्यतन फ्रेम कैसे रख सकता है? – TomSawyer

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