2009-03-12 22 views
7

जब एक पीएनजी एक्सकोड आईफोन प्रोजेक्ट में जोड़ा जाता है, तो संकलक इसे पीएनजीक्रश का उपयोग करके अनुकूलित करता है। डिवाइस पर एक बार, छवि का प्रतिपादन प्रदर्शन बहुत तेज़ है।बाहरी डाउनलोड किए गए पीएनजी पर आईफोन ऑप्टिमाइज़ेशन करना

मेरी समस्या यह है कि मेरा एप्लिकेशन रनटाइम पर बाहरी स्रोत से अपने पीएनजी डाउनलोड करता है (Picasa वेब एल्बम से, Google डेटा एपीआई का उपयोग करके)। दुर्भाग्यवश, इन छवियों का प्रदर्शन काफी खराब है। जब मैं छवि के शीर्ष पर कस्टम प्रतिपादन करता हूं, तो यह आंतरिक रूप से संग्रहीत समकक्षों की तुलना में 100x धीमा लगता है। मुझे दृढ़ता से संदेह है क्योंकि यह डाउनलोड की गई छवियों को अनुकूलित नहीं किया गया है।

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

धन्यवाद!

अद्यतन: कुछ लोगों ने सुझाव दिया है कि यह फ़ाइल के आकार के कारण हो सकता है, लेकिन ऐसा नहीं है। मेरे परीक्षणों के दौरान, मैंने एम्बेडेड संस्करण और बिल्कुल उसी पीएनजी के डाउनलोड किए गए संस्करण का उपयोग करने के बीच स्विच करने के लिए एक टॉगल बटन जोड़ा। केवल अंतर यह है कि एम्बेडेड को संकलन के दौरान 'pngcrush' द्वारा अनुकूलित किया गया था। यह कुछ बाइट-स्वैपिंग (आरजीबीए से बीआरजीए तक) और अल्फा के पूर्व-गुणा करता है। (http://iphonedevelopment.blogspot.com/2008/10/iphone-optimized-pngs.html)

इसके अलावा, जिस प्रदर्शन का मैं जिक्र कर रहा हूं वह डाउनलोड नहीं है, बल्कि प्रतिपादन है। मैं छवि के शीर्ष पर कस्टम पेंटिंग को अतिरंजित करता हूं (UIView की drawRect विधि को ओवरराइड करना), और यह पृष्ठभूमि बहुत ही चंचल है जब पृष्ठभूमि डाउनलोड किया गया संस्करण है, और यह बहुत चिकनी है जब यह एम्बेडेड (और इसलिए अनुकूलित) संस्करण है। फिर, यह बिल्कुल वही फाइल है। एकमात्र अंतर ऑप्टिमाइज़ेशन है, जिसे मैं उम्मीद कर रहा हूं कि मैं इसे डाउनलोड करने के बाद डिवाइस पर रनटाइम पर छवि पर प्रदर्शन कर सकता हूं।

हर किसी की मदद के लिए धन्यवाद!

+0

मुझे नहीं लगता है, जबकि (पहली बार के बाद कहते हैं,) प्रतिपादन आप मूल पीएनजी डेटा को छू जाना चाहिए करने के लिए सामान्य PNG फ़ाइल, इसलिए मैं वास्तव में नहीं है देखें कि यह एक बड़ा अंतर कैसे बना सकता है। शायद यह छवि आकार है, क्योंकि एंड्रयू ग्रांट सुझाव देता है? –

+0

यह ध्यान रखना महत्वपूर्ण है कि पीएनजीक्रश-समतुल्य प्रक्रिया को अभी भी चलाने की आवश्यकता होगी, हालांकि केवल एक बार, इसलिए उस बिंदु पर प्रदर्शन प्रभाव होगा –

उत्तर

1

क्या आप मूल डाउनलोड आकार पर पीएनजी संग्रहीत कर रहे हैं? यदि यह एक बड़ी छवि है तो इसे प्रस्तुत करने में काफी समय लगेगा।

+0

अच्छा विचार, लेकिन डाउनलोड की गई छवि बिल्कुल समान आकार और संकल्प एम्बेडेड है । वास्तव में, यह बिल्कुल वही छवि है। –

2

सतह पर, ऐसा लगता है कि यहां कुछ और खेलना है। किसी भी अतिरिक्त छवि मैनिपुलेशन में केवल तब तक समय जोड़ना चाहिए जब तक यह स्क्रीन पर प्रदर्शित न हो ...

क्या उचित HTTP शीर्षलेख भेजकर सर्वर को छवियों को gzip करने के लिए सर्वर संभव है? (यदि यह फ़ाइल आकार को भी बहुत मदद करता है, तो यह है।)

अस्थायी रूप से पीएनजीक्रश स्रोत का उपयोग करना एक अच्छा परीक्षण भी हो सकता है, बस कुछ माप प्राप्त करने के लिए।

+0

आपकी सलाह के लिए धन्यवाद; मुझे लगता है कि मैं अवधारणा का परीक्षण करने के लिए पीएनजीक्रश का उपयोग करने की कोशिश करूंगा। सर्वर से फ़ाइल डाउनलोड करना और इसे प्रदर्शित करना बहुत तेज़ है, और केवल एक बार होने की आवश्यकता है। प्रदर्शन समस्या तब होती है जब मैं उस UIImage के शीर्ष पर कस्टम प्रस्तुतिकरण को अतिरंजित करता हूं। –

+0

हम्म, यह उन सभी अतिरिक्त परतों का होना चाहिए जो प्रदर्शन को मार रहे हैं। क्या अतिरंजित छवियों को एक ओवरले में मर्ज करना संभव है? वर्तमान में, मैं एक जेपीजी के साथ एक ही ओवरलाइड "कवर" पीएनजी के साथ कुछ कर रहा हूं, और प्रदर्शन काफी अच्छा है। –

+0

ठीक है, यह बात यह है कि ग्राफ़िक के अनुकूलित संस्करण का उपयोग करते समय बहुत अच्छा प्रदर्शन होता है, और बिल्कुल उसी फ़ाइल के डाउनलोड किए गए संस्करण का उपयोग करते समय बहुत खराब होता है। यही कारण है कि मुझे विश्वास है कि लेयरिंग के साथ इसका कोई लेना-देना नहीं है। –

3

तथ्य यह है कि आप कहते हैं कि यह "लगता है" 100x धीमा इंगित करता है कि आपने कोई प्रयोग नहीं किया है, लेकिन अनुमान लगाया है (यह पीएनजी अनुकूलन होना चाहिए), और अब एक झुकाव के आधार पर एक पथ नीचे जा रहे हैं।

आपको यह तय करने के लिए समय बिताना चाहिए कि समस्या हल करने से पहले समस्या क्या है। मेरे पेट का कहना है कि पीएनजी अनुकूलन मुद्दा नहीं होना चाहिए:। कि ज्यादातर छवियों के लोड को प्रभावित करता है, लेकिन यह कोई फर्क नहीं पड़ता एक बार वे स्मृति में हैं क्या प्रारूप फ़ाइल वे में मूल रूप से थे

वैसे भी, आप एक कोशिश करनी चाहिए एबी तुलना, या तो कहीं भी एक अनुकूलित पीएनजी लोड करने के लिए अपना कोड प्राप्त करें और देखें कि यह कैसे तुलना करता है, या एक परीक्षण ऐप बनाएं जो केवल दो पीएनजी प्रकारों पर कुछ चित्रण करता है। एक बार जब आप पुष्टि कर लें कि समस्या क्या है, तो आप यह पता लगा सकते हैं कि आपको अपने ऐप में pngcrush संकलित करने की आवश्यकता है या नहीं।

+0

हे, मैंने बहुत तुलना की है। मेरे पास एक टॉगल बटन है जो मुझे डाउनलोड किए गए संस्करण और उसी पीएनजी के एम्बेडेड संस्करण के बीच ऑन-स्क्रीन छवि को स्वैप करने की अनुमति देता है, और अंतर बहुत बड़ा है। अनुकूलन निम्नलिखित करता है: http://tinyurl.com/6fnsmt –

1

वैसे ऐसा लगता है कि ऐसा करने का एक अच्छा तरीका है (क्योंकि आप आईफोन पर पीएनजीक्रश नहीं चला सकते हैं और उम्मीद करते हैं कि इसे तेज करने की उम्मीद है) आपके अनुरोधों को एक प्रॉक्सी के माध्यम से बनाना होगा जो पीएनजीक्रश चलाता है। प्रॉक्सी में वास्तव में 100x दर्द से आपको कुछ लाभ देने के लिए अच्छी घोड़े की शक्ति होगी।

7

आपके द्वारा पोस्ट किया गया लिंक आपके प्रश्न का बहुत अधिक उत्तर देता है।

बिल्ड प्रक्रिया के दौरान एक्सकोड आपके पीएनजी को प्री-प्रोसेस करता है, इसलिए यह एक प्रारूप में है जो आईफोन में ग्राफिक्स चिप के लिए अधिक अनुकूल है।

पीएनजी जो इस तरह संसाधित नहीं किया गया है, संभवतः एक धीमी प्रतिपादन पथ का उपयोग करेगा, जो गैर देशी प्रारूप से संबंधित है और तथ्य यह है कि प्रत्येक रंग के लिए अल्फा को अलग से गणना की जानी चाहिए।

तो आपके पास दो विकल्प हैं;

  1. वही काम करें जो pngcrush करता है और ऑर्डर/प्री-गुणा अल्फा को स्वैप करता है। गति एक या दोनों के कारण हो सकती है।

  2. अपनी छवि लोड करने के बाद, आप इससे एक नई छवि "बना सकते हैं"। यह नई छवि आईफोन के मूल प्रारूप में होनी चाहिए और इसलिए इसे तेज करना चाहिए। नकारात्मकता यह संभवतः थोड़ा और स्मृति ले सकती है।

उदा।

CGRect area = CGRectMake(0, 0, width, height); 
CGSize size = area.size; 
UIGraphicsBeginImageContext(size); 

[oldImage drawInRect:area]; 

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
0

आप कहते हैं कि आप एक UIView के drawRect: विधि अधिभावी द्वारा छवि के शीर्ष पर बना रहे हैं। क्या आप अपनी छवि को बार-बार अपनी कस्टम सामग्री के साथ चित्रित करके कुछ एनीमेशन करने की कोशिश कर रहे हैं?

यदि आप अपनी कस्टम सामग्री को अलग दृश्य या परत में डालते हैं तो आपको बेहतर परिणाम मिल सकते हैं, और ओएस को पृष्ठभूमि पर परिणाम को कंपोजिट करने के साथ सौदा करने दें। ओएस केवल उस स्क्रीन के उन हिस्सों को अपडेट करेगा जो आप वास्तव में बदलते हैं, और पूरी छवि को अक्सर बार-बार नहीं दबाएंगे। ट्रांस को

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