2013-07-11 7 views
8

2011 के डब्ल्यूडब्ल्यूडीसी वीडियो सत्र 121 में, यूआई के प्रदर्शन में सुधार के लिए, प्रस्तुतकर्ता ने यूआईबीज़ियरपाथ का उपयोग ड्रॉरेक्ट में डालने के लिए गोलाकार कोनों को आकर्षित करना चुना: बजाय परत पर कोने त्रिज्या को सेट करने के बजाय।drawRect में गोलाकार कोने ड्राइंग कर रहा है: CALayer setCornerRadius का उपयोग करने से तेज़?

UIBezierPath का उपयोग करके ड्राइंग क्यों तेजी से तेज है? drawRect: सॉफ़्टवेयर में होता है जो धीमा भी हो सकता है।

+0

आईडी इसे खुद को जानना पसंद है। –

+0

IMHO हार्डवेयर में ड्राइंग होता है, drawRect डिस्प्ले सूचियां बनाता है, जो हार्डवेयर को पास कर दिए जाते हैं और – AlexWien

उत्तर

22

संक्षिप्त उत्तर: संभवतः जब तक आप एक प्रदर्शन समस्या नहीं देखते हैं तब तक केवल कैलियर के कोने के साथ रहें।

लांग जवाब:

हम पहले "ड्राइंग" और "संयोजन" के बीच अंतर करने की जरूरत है।

आईओएस पर चित्रण पिक्सल (एक सीपीयू सीमित कार्य) के साथ बनावट भरने का सरल कार्य है। कंपोजिटिंग उन सभी बनावटों को स्क्रीन पर प्रिंट करने के लिए एक ही फ्रेम में फ़्लैटन करने का कार्य है (एक जीपीयू सीमित कार्य)। आम तौर पर, जब आप स्क्रॉलिंग या एनिमेटिंग करते हैं तो आप ज्यादातर जीपीयू पर कर लगा रहे हैं, जो कि सभी पिक्सल को एक-एक करके स्थानांतरित करने जैसी चीजें हैं, जीपीयू नाश्ते के लिए खाती है।

-DrawRect: शुद्ध ड्राइंग है, और बनावट को भरने के लिए CPU का उपयोग करता है। कैलियर के कोने त्रिज्या कंपोजिटिंग चरण पर किया जाता है, और जीपीयू पर जोर देता है।

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

लेकिन इसके लिए मेरा शब्द न लें, कुछ गणित करें। मैंने Florian Kugler’s benchmark को अनुकूलित किया और आईओएस 4 एस चल रहा आईओएस 6.1.3 पर चलाया। मैं मापता हूं कि शुरुआत में एक सेकंड के 1/60 वें में कितने विचार बनाए जा सकते हैं, फिर फ्रेम दर 60fps से नीचे गिरने से पहले कितने विचार एनिमेटेड किए जा सकते हैं। दूसरे शब्दों में: अग्रिम लागत बनाम फ्रेमरेट लागत।

 
             | -drawRect:  | CALayer’s cornerRadus 
max number of views rendered in 16.6ms |  5 views |  110 views 
max number of views animating at 60fps | ~400 views |  12 views 

(ध्यान दें कि एप्लिकेशन 500 -drawRect पर बहुत अधिक स्मृति का उपयोग करने के लिए मार दिया जाता है: विचार)

दिन के अंत में, मेरे अपने परियोजनाओं में मैं CALayer के cornerRadius के रूप में ज्यादा छड़ी के लिए करते हैं यथासंभव। मुझे गोल कोनों और-ड्राउरक्ट के साथ कुछ विचारों की शायद ही कभी आवश्यकता है: प्रारंभिक प्रदर्शन हिट में बहुत अधिक है। और कोनों के चारों ओर देखने के लिए एक दृश्य subclassing बस, उह है।

कोई फर्क नहीं पड़ता कि आप किस विधि को चुनते हैं, सुनिश्चित करें कि आप मापते हैं और ध्यान देते हैं कि आपका ऐप कितना आसान और उत्तरदायी है, और तदनुसार जवाब दें।

+0

प्रदान किए जाते हैं सबसे उत्कृष्ट प्रतिक्रिया के लिए धन्यवाद। –

+0

क्या आप अन्य समान चीजों, जैसे कि छाया, मास्क, टेक्स्ट साइजिंग और प्रतिपादन आदि पर टिप्पणी कर सकते हैं? क्या ये ऑपरेशन सीपीयू या जीपीयू पर किए जाते हैं, या आपको drawRect: vs CALayer/UIKit गुणों का उपयोग करने पर विचार कब करना चाहिए? –

+0

उपरोक्त पोस्ट (http://floriankugler.com/blog/2013/5/24/layer-trees-vs-flat-drawing-graphics-performance-across-ios-device- जनरेशन) सभी drawRect बनाम मानक को मापने के बारे में है परतों। अन्यथा मुझे छाया के अलावा वास्तव में विशिष्ट प्रतिक्रिया नहीं है।विभिन्न प्रदर्शनों के साथ छाया (मैन्युअल रूप से ड्राइंग, कैलियर छाया, कैलियर छाया + रास्टरराइज, कैलियर छाया + छायापाथ) को संभालने के कुछ तरीके हैं: http://www.omnigroup.com/blog/entry/ipad_drop_shadow_performance_test – shusta

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