आकर्षित करने के लिए या नहीं आकर्षित करने के लिए (जब एक का उपयोग करना चाहिए drawRect / कोर ग्राफिक्स बनाम साक्षात्कार / चित्र और क्यों?)


142

इस प्रश्न के उद्देश्य को स्पष्ट करने के लिए: मुझे पता है कि दोनों साक्षात्कारों और ड्रॉअर का उपयोग करके जटिल विचार कैसे बनाएं। मैं कब और क्यों एक दूसरे पर एक का उपयोग करने के लिए पूरी तरह से समझने की कोशिश कर रहा हूँ।

मैं यह भी समझता हूं कि समय से पहले इसे अनुकूलित करने का कोई मतलब नहीं है, और किसी भी रूपरेखा को करने से पहले कुछ और अधिक कठिन तरीके से करें। विचार करें कि मैं दोनों तरीकों से सहज हूं, और अब वास्तव में एक गहरी समझ चाहता हूं।

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

निष्पक्ष होने के लिए, यह तब लिखा गया था जब 3GS काफी नया ब्रांड था, और iDevices ने तब से बहुत तेजी से प्राप्त किया है। फिर भी इस पद्धति है नियमित रूप से सुझाव पर interwebs और कहीं और उच्च प्रदर्शन तालिकाओं के लिए। वास्तव में यह Apple के टेबल सैंपल कोड में एक सुझाई गई विधि है , कई WWDC वीडियो ( iOS डेवलपर्स के लिए व्यावहारिक ड्राइंग ) और कई iOS प्रोग्रामिंग पुस्तकों में सुझाया गया है ।

यहां तक कि कर रहे हैं भयानक लग रही उपकरण ग्राफिक्स डिजाइन और उनके लिए कोर ग्राफिक्स कोड उत्पन्न करने के लिए।

तो सबसे पहले मैं विश्वास करने के लिए नेतृत्व कर रहा हूं "कोर ग्राफिक्स मौजूद है एक कारण है। यह तेज़ है!"

लेकिन जैसे ही मुझे लगता है कि मुझे यह विचार "अनुकूल कोर ग्राफिक्स जब संभव हो" मिलता है, तो मैं यह देखना शुरू कर देता हूं कि ड्राअरेक्ट अक्सर एक ऐप में खराब जवाबदेही के लिए जिम्मेदार होता है, बहुत महंगा मेमोरी वार है, और वास्तव में सीपीयू पर कर लगाता है। मूल रूप से, कि मुझे " ओवरराइडिंग ड्रॉअर से बचना चाहिए" (WWDC 2012 iOS ऐप का प्रदर्शन: ग्राफिक्स और एनिमेशन )

तो मुझे लगता है, सब कुछ की तरह, यह जटिल है। हो सकता है कि आप अपने आप को और दूसरों को यह समझने में मदद कर सकें कि ड्रॉ का उपयोग कब और क्यों करना है?

मैं कोर ग्राफिक्स का उपयोग करने के लिए कुछ स्पष्ट स्थितियों को देखता हूं:

  1. आपके पास डायनामिक डेटा (Apple का स्टॉक चार्ट उदाहरण) है
  2. आपके पास एक लचीला UI तत्व है जिसे एक साधारण आकार बदलने योग्य छवि के साथ निष्पादित नहीं किया जा सकता है
  3. आप एक गतिशील ग्राफ़िक बना रहे हैं, कि एक बार प्रदान किया गया कई स्थानों पर उपयोग किया जाता है

मैं कोर ग्राफिक्स से बचने के लिए स्थितियों को देखता हूं:

  1. आपके विचार के गुणों को अलग से एनिमेटेड करने की आवश्यकता है
  2. आपके पास अपेक्षाकृत छोटा दृश्य पदानुक्रम है, इसलिए CG का उपयोग करने वाला कोई भी अतिरिक्त प्रयास लाभ के लायक नहीं है
  3. आप पूरी चीज़ को फिर से देखे बिना दृश्य के टुकड़ों को अपडेट करना चाहते हैं
  4. जब माता-पिता के दृश्य का आकार बदलता है, तो आपके साक्षात्कार के लेआउट को अपडेट करना होगा

इसलिए अपने ज्ञान को सर्वश्रेष्ठ बनाएं। आप किन परिस्थितियों में ड्रॉअर / कोर ग्राफ़िक्स के लिए पहुँचते हैं (जो कि सबव्यू के साथ भी पूरा किया जा सकता है)? कौन से कारक आपको उस निर्णय की ओर ले जाते हैं? हनी चिकनी टेबल सेल स्क्रॉलिंग के लिए अनुशंसित एक कस्टम दृश्य में कैसे / क्यों आरेखण किया जाता है, फिर भी Apple सामान्य रूप से प्रदर्शन कारणों के खिलाफ ड्रॉ की सलाह देता है? सरल पृष्ठभूमि छवियों के बारे में क्या है (जब आप उन्हें सीजी बनाम एक आकार देने वाली png छवि का उपयोग करके बनाते हैं)?

इस विषय की गहरी समझ के लिए सार्थक ऐप्स बनाने की आवश्यकता नहीं हो सकती है, लेकिन मुझे यह समझाने में सक्षम हुए बिना तकनीकों के बीच चयन करना पसंद नहीं है। मेरा दिमाग मुझ पर पागल हो जाता है।

प्रश्न अद्यतन

सभी की जानकारी के लिए धन्यवाद। यहाँ कुछ स्पष्ट प्रश्न:

  1. यदि आप कोर ग्राफिक्स के साथ कुछ आकर्षित कर रहे हैं, लेकिन UIImageViews और पहले से रेंडर किए गए png के साथ एक ही बात को पूरा कर सकते हैं, तो क्या आपको हमेशा उस मार्ग पर जाना चाहिए?
  2. एक समान प्रश्न: विशेष रूप से इस तरह के बदमाश उपकरण के साथ , जब आपको कोर ग्राफिक्स में इंटरफ़ेस तत्वों पर विचार करना चाहिए? (संभवतया जब आपके तत्व का प्रदर्शन परिवर्तनशील हो। उदाहरण के लिए 20 अलग-अलग रंगों में भिन्नता वाला एक बटन। कोई अन्य मामले?)
  3. नीचे दिए गए मेरे उत्तर में मेरी समझ को देखते हुए, टेबल सेल के लिए समान प्रदर्शन लाभ संभवतः आपके सेल के एक स्नैपशॉट बिटमैप को प्रभावी रूप से प्राप्त करने के बाद प्राप्त किया जा सकता है, जब आपके कॉम्प्लेक्स UIView ने खुद को प्रस्तुत किया, और अपने जटिल दृश्य को स्क्रॉल और छुपाते हुए प्रदर्शित किया? जाहिर है कुछ टुकड़ों पर काम करना होगा। बस एक दिलचस्प विचार मेरे पास था।

जवाबों:


72

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

सामान्य वर्कफ़्लो को साक्षात्कार के साथ तालिकाएँ बनाने के लिए होना चाहिए। अपने ऐप द्वारा समर्थित सबसे पुराने हार्डवेयर पर फ्रेम दर को मापने के लिए इंस्ट्रूमेंट्स का उपयोग करें। यदि आप 60fps नहीं पा सकते हैं, तो CoreGraphics पर जाएं। जब आपने कुछ समय के लिए ऐसा किया है, तो आपको यह समझ में आता है कि UIKit संभवत: समय की बर्बादी है।

तो, कोर ग्राफिक्स तेज क्यों है?

CoreGraphics वास्तव में तेज़ नहीं है। यदि यह हर समय उपयोग किया जा रहा है, तो आप शायद धीमी गति से चल रहे हैं। यह एक समृद्ध ड्राइंग एपीआई है, जिसे सीपीयू पर काम करने की आवश्यकता होती है, क्योंकि बहुत सारे यूआईआईटीटी काम का विरोध किया जाता है जो कि GPU पर लोड होता है। यदि आपको स्क्रीन के पार जाने वाली गेंद को चेतन करना है, तो सेटनैड्सप्लेप्ले को 60 बार प्रति सेकंड के दृश्य पर कॉल करना एक भयानक विचार होगा। इसलिए, यदि आपके पास आपके दृश्य के उप-घटक हैं जो व्यक्तिगत रूप से एनिमेटेड होने की आवश्यकता है, तो प्रत्येक घटक की एक अलग परत होनी चाहिए।

दूसरी समस्या यह है कि जब आप drawRect के साथ कस्टम ड्राइंग नहीं करते हैं, तो UIKit स्टॉक व्यू को ऑप्टिमाइज़ कर सकता है, इसलिए drawRect एक नो-ऑप है, या यह कंपोज़िंग के साथ शॉर्टकट ले सकता है। जब आप ड्रॉअर को ओवरराइड करते हैं, तो UIKit को धीमा रास्ता अपनाना पड़ता है क्योंकि आपको पता नहीं है कि आप क्या कर रहे हैं।

टेबल व्यू कोशिकाओं के मामले में लाभ से इन दो समस्याओं को हल किया जा सकता है। ड्रा के बाद कॉल किया जाता है जब कोई दृश्य पहली बार स्क्रीन पर दिखाई देता है, तो सामग्री को कैश किया जाता है, और स्क्रॉल GPU द्वारा निष्पादित एक सरल अनुवाद है। क्योंकि आप एक ही दृश्य के साथ काम कर रहे हैं, एक जटिल पदानुक्रम के बजाय, UIKit की ड्राअरटेप ऑप्टिमाइज़ेशन कम महत्वपूर्ण हो जाती है। तो अड़चन यह हो जाती है कि आप अपने कोर ग्राफिक्स ड्राइंग को कितना अनुकूलित कर सकते हैं।

जब भी आप कर सकते हैं, UIKit का उपयोग करें। सबसे सरल कार्यान्वयन करें जो काम करता है। प्रोफाइल। जब कोई प्रोत्साहन हो, तो अनुकूलन करें।


53

अंतर यह है कि यूआईवीवाई और कैलेयर अनिवार्य रूप से निश्चित छवियों में सौदा करते हैं। इन छवियों को ग्राफिक्स कार्ड पर अपलोड किया जाता है (यदि आप ओपनजीएल को जानते हैं, तो एक बनावट के रूप में एक छवि के बारे में सोचें, और एक UIView / CALayer इस तरह की बनावट दिखाने वाले बहुभुज के रूप में)। एक बार जब कोई छवि GPU पर होती है, तो इसे बहुत तेज़ी से और यहां तक ​​कि कई बार खींचा जा सकता है, और (थोड़ी सी परफॉर्मेंस पेनल्टी के साथ) अन्य छवियों के शीर्ष पर अल्फा पारदर्शिता के विभिन्न स्तरों के साथ भी।

CoreGraphics / Quartz इमेजेस जनरेट करने के लिए एक एपीआई है । यह एक पिक्सेल बफर लेता है (फिर से, OpenGL बनावट पर विचार करें) और इसके अंदर अलग-अलग पिक्सेल बदलता है। यह सब रैम और सीपीयू पर होता है, और केवल एक बार क्वार्ट्ज हो जाने के बाद, छवि को GPU में वापस "फ्लश" किया जाता है। GPU से एक छवि प्राप्त करने की यह गोल-यात्रा, इसे बदलना, फिर संपूर्ण छवि (या कम से कम एक तुलनात्मक रूप से बड़े हिस्से) को GPU पर वापस अपलोड करना धीमा है। इसके अलावा, वास्तविक ड्राइंग जो क्वार्ट्ज करता है, जबकि आप जो कर रहे हैं उसके लिए वास्तव में तेज है, जीपीयू क्या करता है की तुलना में धीमी है।

यह स्पष्ट है, जीपीयू पर विचार करना ज्यादातर बड़े हिस्से में अपरिवर्तित पिक्सल के आसपास घूम रहा है। क्वार्ट्ज पिक्सेल की रैंडम-एक्सेस करता है और सीपीयू को नेटवर्किंग, ऑडियो आदि के साथ साझा करता है। इसके अलावा, यदि आपके पास कई तत्व हैं जो आप एक ही समय में क्वार्ट्ज का उपयोग करते हैं, तो आपको उन सभी को फिर से आकर्षित करना होगा जब एक परिवर्तन होता है, तो अपलोड करें पूरे चंक, जबकि यदि आप एक छवि को बदलते हैं और फिर UIViews या CALayers को अपनी अन्य छवियों पर पेस्ट करने देते हैं, तो आप GPU में बहुत कम मात्रा में डेटा अपलोड करने से दूर हो सकते हैं।

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

जब आप कार्यान्वयन-वापस ले लेते हैं: तो यह एक नई छवि बनाने का कारण बनता है। फिर आप क्वार्ट्ज का उपयोग करके सीपीयू पर आकर्षित होते हैं। यदि आप अपने ड्राअर में एक UIImage आकर्षित करते हैं, तो यह संभावना है कि वह GPU से छवि को डाउनलोड करता है, उसे उस चित्र में कॉपी करता है जिसे आप ड्राइंग कर रहे हैं और एक बार जब आप कर लेते हैं, तो छवि की इस दूसरी प्रति को ग्राफिक्स कार्ड पर वापस अपलोड करता है । तो आप डिवाइस पर दो बार GPU मेमोरी का उपयोग कर रहे हैं।

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

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

यदि आपके पास सामग्री है जो गतिशील रूप से रनटाइम पर उत्पन्न होती है, लेकिन एप्लिकेशन के जीवनकाल की अवधि के लिए समान रहती है (उदाहरण के लिए उपयोगकर्ता नाम युक्त एक लेबल) तो यह वास्तव में पाठ के साथ, क्वार्ट्ज का उपयोग करते हुए एक बार पूरी चीज को आकर्षित करने के लिए समझ में आता है। बटन सीमा आदि, पृष्ठभूमि के हिस्से के रूप में। लेकिन यह आमतौर पर एक अनुकूलन है जिसकी आवश्यकता तब तक नहीं होती जब तक कि इंस्ट्रूमेंट्स ऐप आपको अलग तरह से न बताए।


विस्तृत उत्तर के लिए धन्यवाद। उम्मीद है कि अधिक लोग नीचे स्क्रॉल करें और इसे भी वोट करें।
बॉब स्प्रीन

काश मैं इसे दो बार बढ़ा पाता। महान समीक्षा के लिए धन्यवाद!
तिब्बत का समुद्री तट

थोड़ा सुधार: अधिकांश मामलों में GPU से कोई डाउन लोड नहीं होता है , लेकिन अपलोड अभी भी मूल रूप से सबसे धीमा ऑपरेशन है जिसे आप GPU से करने के लिए कह सकते हैं, क्योंकि इसमें बड़े पिक्सेल बफ़र्स को धीमी प्रणाली RAM से तेजी से VRAM में स्थानांतरित करना है। OTOH एक बार एक छवि होने के बाद, इसे स्थानांतरित करने में बस निर्देशांक (कुछ बाइट्स) का एक नया सेट जीपीयू में भेजना शामिल है, इसलिए मुझे पता है कि कहां आकर्षित करना है।
गवाह

@uliwitness मैं आपके जवाब से गुज़र रहा था और आपने एक वस्तु को "अपारदर्शी उस छवि के पीछे सब कुछ तिरोहित" के रूप में चिह्नित किया। क्या आप कृपया उस हिस्से पर कुछ प्रकाश डाल सकते हैं?
रिख

@ रिख एक परत को अपारदर्शी के रूप में चिह्नित करने का मतलब है कि ए) ज्यादातर मामलों में, GPU उस परत के नीचे अन्य परतों को खींचने से परेशान नहीं करेगा, अच्छी तरह से, कम से कम उन हिस्सों में जो अपारदर्शी परत के नीचे स्थित हैं। यहां तक ​​कि अगर वे खींचे गए हैं, तो यह वास्तव में अल्फा सम्मिश्रण नहीं करेगा, बल्कि स्क्रीन पर केवल शीर्ष परत की सामग्री की प्रतिलिपि बनाएगा (आमतौर पर एक अपारदर्शी परत में पूरी तरह से पारदर्शी पिक्सेल काला या कम से कम उनके रंग का एक अपारदर्शी संस्करण होगा)
uliwitness

26

मैं कोशिश कर रहा हूं और यहां जो मैं दूसरे के उत्तरों से अलग कर रहा हूं, उसका सारांश रखूं और मूल प्रश्न के अपडेट में स्पष्ट प्रश्न पूछूं। लेकिन मैं दूसरों को प्रोत्साहित करता हूं कि वे उत्तर देते रहें और उन लोगों को वोट दें जिन्होंने अच्छी जानकारी दी है।

सामान्य पहूंच

यह काफी स्पष्ट है कि सामान्य दृष्टिकोण, के रूप में बेन Sandofsky में उल्लेख किया है उसके जवाब होना चाहिए, "जब भी आप उपयोग UIKit। सरल कार्यान्वयन ऐसा कर सकते हैं काम करता है। प्रोफ़ाइल। जब एक प्रोत्साहन नहीं है, का अनुकूलन।"

क्यों

  1. एक iDevice में दो मुख्य संभावित अड़चनें हैं, सीपीयू और जीपीयू
  2. सीपीयू एक दृश्य के प्रारंभिक ड्राइंग / प्रतिपादन के लिए जिम्मेदार है
  3. जीपीयू अधिकांश एनीमेशन (कोर एनिमेशन), लेयर इफेक्ट्स, कंपोज़िंग आदि के लिए ज़िम्मेदार है।
  4. जटिल दृश्य पदानुक्रम को संभालने के लिए बनाए गए UIView में बहुत सारे अनुकूलन हैं, कैशिंग, आदि
  5. जब ओवरराइडिंग ओवरराइडिंग होती है तो आपको यूआईवीवाई के लाभ के बहुत सारे लाभ याद आते हैं, और यह आमतौर पर यूएवीवाई को प्रतिपादन को संभालने की तुलना में धीमा होता है।

एक फ्लैट UIView में ड्राइंग सेल सामग्री बहुत ही स्क्रॉलिंग टेबल पर आपके FPS में सुधार कर सकती है।

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

वास्तव में, कोर ग्राफिक्स प्रारंभिक रेंडर के लिए एक नेस्टेड यूआईवीयूवी पदानुक्रम की तुलना में बहुत अच्छा हो सकता है। हालाँकि, ऐसा लगता है कि चॉपी स्क्रॉलिंग का विशिष्ट कारण यह है कि आप GPU को टोंटी मार रहे हैं, इसलिए आपको इसे संबोधित करना होगा।

ओवरराइडिंग क्यों करें (कोर ग्राफिक्स का उपयोग करके) टेबल स्क्रॉलिंग में मदद कर सकते हैं:

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

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

इसलिए सारांश में, कोर ग्राफिक्स के साथ एक दृश्य में अपने सेल को खींचने का कारण आपकी टेबल स्क्रॉलिंग को तेज कर सकता है क्योंकि यह तेजी से ड्राइंग नहीं कर रहा है, लेकिन क्योंकि यह GPU पर लोड को कम कर रहा है, जो कि उस विशेष परिदृश्य में आपको परेशानी दे रहा है। ।


1
हालांकि सावधान। GPUs प्रभावी रूप से प्रत्येक फ्रेम के लिए पूरी परत के पेड़ को फिर से मिश्रित करता है। तो एक परत को स्थानांतरित करना प्रभावी रूप से शून्य लागत है। यदि आप एक बड़ी परत बनाते हैं, तो केवल उस एक परत को हिलाने से कई गति होती है। इस परत के अंदर कुछ हिलाने पर अचानक सीपीयू शामिल होता है और इसकी लागत होती है। चूँकि सेल सामग्री आम तौर पर बहुत कम नहीं बदलती है (केवल तुलनात्मक रूप से दुर्लभ उपयोगकर्ता क्रियाओं के जवाब में), कम विचारों का उपयोग करके चीजों को गति मिलती है। लेकिन सभी सेल के साथ एक बड़ा दृश्य बनाना एक बुरा आइडिया होगा।
uliwitness

6

मैं एक गेम डेवलपर हूं, और मैं वही सवाल पूछ रहा था जब मेरे दोस्त ने मुझे बताया कि मेरा UIImageView आधारित दृश्य पदानुक्रम मेरे खेल को धीमा करने और इसे भयानक बनाने वाला था। मैं तब सब कुछ अनुसंधान करने के लिए आगे बढ़ा, जिसके बारे में मुझे पता चला कि क्या यूआईवाईवाई, कोरग्राफिक्स, ओपनजीएल या कोकोस 2 डी जैसी कुछ 3 पार्टी का उपयोग करना है या नहीं। WWDC में मुझे दोस्तों, शिक्षकों और Apple इंजीनियरों से लगातार जवाब मिला कि अंत में बहुत अंतर नहीं होगा क्योंकि कुछ स्तर पर वे सभी एक ही काम कर रहे हैं । UIView जैसे उच्च-स्तरीय विकल्प, CoreGraphics और OpenGL जैसे निचले स्तर के विकल्पों पर निर्भर करते हैं, बस वे कोड में लिपटे रहते हैं जिससे आपको इसका उपयोग करना आसान हो जाता है।

यदि आप यूआईईवाई को फिर से लिखना शुरू करने जा रहे हैं, तो कोरग्राफिक्स का उपयोग न करें। हालाँकि, आप CoreGraphics का उपयोग करने से कुछ गति प्राप्त कर सकते हैं, जब तक कि आप अपने सभी ड्राइंग को एक दृश्य में नहीं करते हैं, लेकिन क्या यह वास्तव में इसके लायक है? मुझे जो उत्तर मिला है वह आमतौर पर नहीं है। जब मैंने पहली बार अपना खेल शुरू किया, तो मैं iPhone 3G के साथ काम कर रहा था। जैसे-जैसे मेरा खेल जटिलता में बढ़ता गया, मैंने कुछ अंतराल देखना शुरू किया, लेकिन नए उपकरणों के साथ यह पूरी तरह से ध्यान देने योग्य नहीं था। अब मेरे पास बहुत सारी कार्रवाई चल रही है, और एकमात्र अंतराल 1-3 एफपीएस में गिरावट लगती है जब एक iPhone 4 पर सबसे जटिल स्तर पर खेल रहा है।

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

इसलिए अंत में, आप CoreGraphics का उपयोग करने से थोड़ा सा लाभ प्राप्त करने में सक्षम हो सकते हैं, लेकिन आमतौर पर यह इसके लायक नहीं होगा या इसका कोई प्रभाव नहीं हो सकता है। कोरग्राफिक्स का उपयोग करने का एकमात्र समय है जब पाठ और चित्रों के बजाय ज्यामितीय आकृतियों को चित्रित किया जाता है।


8
मुझे लगता है कि आप कोर ग्राफिक्स के साथ कोर एनिमेशन को भ्रमित कर सकते हैं। कोर ग्राफिक्स वास्तव में धीमा है, सॉफ्टवेयर आधारित ड्राइंग है और इसका उपयोग नियमित रूप से यूआईवीवाईई ड्राइंग के लिए नहीं किया जाता है जब तक कि आप ड्रॉअर विधि को ओवरराइड नहीं करते हैं। कोर एनीमेशन हार्डवेयर त्वरित, तेज़ और ज़िम्मेदार है जो आप स्क्रीन पर देखते हैं।
निक लॉकवुड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.