2010-03-24 12 views
9

मेरे आवेदन में मुझे कण प्रणाली की तरह कुछ चाहिए था इसलिए मैंने निम्न किया:कुशलतापूर्वक कई छवियों को कैसे दिखाएं? (आईफोन प्रोग्रामिंग)

जबकि एप्लिकेशन प्रारंभ होता है, मैं एक यूआईएममेज

laserImage = [UIImage imageNamed:@"laser.png"]; 

UIImage * लेजर इमेज को अपने नियंत्रक के इंटरफ़ेस में घोषित किया जाता है। अब हर बार मुझे एक नया कण चाहिए, यह कोड एक बनाता है:

// add new Laserimage 
UIImageView *newLaser = [[UIImageView alloc] initWithImage:laserImage]; 
[newLaser setTag:[model.lasers count]-9]; 
[newLaser setBounds:CGRectMake(0, 0, 17, 1)]; 
[newLaser setOpaque:YES]; 
[self.view addSubview:newLaser]; 
[newLaser release]; 

कृपया ध्यान दें कि छवियां केवल 17px * 1px छोटी हैं और model.lasers सभी आंतरिक गणना ग्राफिकल आउटपुट से अलग करने के लिए एक आंतरिक सरणी है। तो मेरे मुख्य ड्राइंग लूप में मैंने सभी UIImageView की स्थिति को मेरे मॉडल में गणना की गई स्थिति में सेट किया है। Lasers array:

for (int i = 0; i < [model.lasers count]; i++) { 
    [[self.view viewWithTag:i+10] setCenter:[[model.lasers objectAtIndex:i] pos]]; 
} 

मैंने टैग को 10 तक बढ़ाया क्योंकि डिफ़ॉल्ट 0 है और मैं सभी को स्थानांतरित नहीं करना चाहता डिफ़ॉल्ट टैग के साथ विचार।

तो एनीमेशन लगभग 10-20 छवियों के साथ ठीक दिखता है लेकिन लगभग 60 छवियों के साथ काम करते समय वास्तव में धीमा हो जाता है। तो मेरा सवाल यह है: क्या ओपनजीएल ईएस में शुरू किए बिना इसे अनुकूलित करने का कोई तरीका है?

उत्तर

8

जैसा कि जेफ 7 और फेंडरमोस्ट्रो ने कहा, आप उच्च स्तरीय एपीआई (UIKit) का उपयोग कर रहे हैं, और आप निचले एपीआई, या तो CoreAnimation या OpenGL का उपयोग करके बेहतर प्रदर्शन करेंगे। (Cocos2d ओपन के शीर्ष पर बनाया गया है)

  • आपका सबसे अच्छा विकल्प, UIImageViews के बजाय CALayers का उपयोग अपने UIImage से एक CGImageRef हो और इन परतों के लिए सामग्री के रूप में सेट करने के लिए किया जाएगा।

  • इसके अलावा, आप कैलियर का पूल रखना चाहेंगे और आवश्यकतानुसार छिपकर/दिखाकर उन्हें पुन: उपयोग कर सकते हैं। 17 * 1 पिक्सेल के 60 कैलियर ज्यादा नहीं हैं, मैं इसे अतिरिक्त अनुकूलन की आवश्यकता के बिना सैकड़ों के साथ कर रहा हूं।

इस तरह, छवियों को पहले ही डिकंप्रेस्ड किया जाएगा और वीडियो मेमोरी में उपलब्ध होगा। UIKit का उपयोग करते समय, सब कुछ सीपीयू के माध्यम से जाता है, UIViews के निर्माण का जिक्र नहीं करना जो कि भारी भारी वस्तुएं हैं।

+0

यह सही उत्तर है। आपका कोड तब तक ठीक काम करेगा जब तक कि आपके उपयोग CALayers और प्रत्येक का उपयोग उसी परत छवि पर सेट समान परत.contents का उपयोग न करें। ओपनजीएल में अपना पूरा गेम रिवायर करना अधिक होगा, आपको केवल यूआईएममेज व्यू को आवंटित करने की आवश्यकता नहीं है, जो आपके कार्यान्वयन के मुद्दे की जड़ है। Http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Conceptual/CoreAnimation_guide/SettingUpLayerObjects/SettingUpLayerObjects.html#//apple_ref/doc/uid/TP40004514-CH13-SW12 देखें – MoDJ

0

मैं ओपनजीएल ईएस का उपयोग शुरू करने की सलाह दूंगा, cocos2d for iPhone नामक एक उत्कृष्ट ढांचा है जो इस प्रकार के प्रोग्रामिंग को बहुत आसान और तेज़ बना सकता है। अपने कोड पर एक त्वरित रूप से, आप लेजर को CCSprite के रूप में पुनः लोड किया जा सकता है जो कई अन्य चीज़ों के बीच एक दृश्य के चारों ओर छवियों को स्थानांतरित करने का एक आसान तरीका है।

+0

मैंने अभी कोकोस 2 डी पर एक त्वरित नज़र डाली और यह काफी सक्षम लग रहा था, लेकिन मैंने लगभग अपना ऐप समाप्त कर दिया और एक पुनर्लेखन का समय बहुत अधिक समय लगेगा। क्या आपके पास कोई अन्य विचार है? – Thomas

1

UIImageView एकल या एकाधिक छवियों को प्रदर्शित करने के लिए बनाया गया है। इसलिए, हर बार UIImageView बनाने के बजाय, आपको एक नई छवि बनाने पर विचार करना चाहिए और इसे इसके बजाय UIImageView में जोड़ना चाहिए।

here देखें।

+0

ऐप्पल के प्रलेखन का कहना है कि UIImageView एक छवि दिखाने या छवियों की श्रृंखला को एनिमेट करने के लिए है। चूंकि मुझे एक बार में सभी छवियों को दिखाने की ज़रूरत है, इसलिए मैं इस कार्यक्षमता का उपयोग नहीं कर सकता ... अन्य विचार? – Thomas

+0

ओह, क्षमा करें थॉमस, मुझे नहीं पता कि आगे बढ़ना है। आइए प्रतीक्षा करें कि समुदाय से कुछ अन्य जवाब हैं या नहीं। –

+0

हाय थॉमस, समस्या यह हो सकती है कि आपने ड्राइंग संदर्भ को मंजूरी नहीं दी है। क्या आप इसे दोबारा जांच सकते हैं? –

3

ऐसा लगता है कि आप UIKit API का उपयोग करके एक गेम को कोड करने का प्रयास कर रहे हैं, जो इस तरह के उद्देश्य के लिए वास्तव में बहुत उपयुक्त नहीं है। जब भी आप एक UIView आवंटित करते हैं, तो आप डिवाइस के संसाधनों का विस्तार कर रहे हैं, जो मंदी पैदा करता है क्योंकि वस्तु निर्माण महंगा है। आप CoreAnimation को छोड़कर जो प्रदर्शन चाहते हैं उसे प्राप्त करने में सक्षम हो सकते हैं, हालांकि सीमित समय सीमा में सैकड़ों छवियों को चित्रित करने में वास्तव में अच्छा है, हालांकि यदि आप OpenGL या Cocos2d जैसे इंजन का उपयोग करते हैं तो यह अभी भी बेहतर होगा।

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