2012-09-17 19 views
5

मैं एक ऐप विकसित कर रहा हूं, जिसमें टेक्स्ट स्पष्टता उद्देश्यों के लिए उन छवियों का उपयोग करने की आवश्यकता है जिनमें उच्च रिज़ॉल्यूशन (2000 x 2000) है।बहुत उच्च संकल्प छवियों को संभालने का सबसे अच्छा तरीका क्या है?

मेरे पास पृष्ठभूमि छवि है, जिस पर मुझे ओवरले छवियों को एक ही रिज़ॉल्यूशन के साथ दिखाने की आवश्यकता है। ओवरलेज़ की संख्या 2 से 30 तक परिवर्तनीय है।

छवि को यूआईएममेज के साथ लोड करने के रूप में, प्रत्येक पिक्सेल के लिए 4 बाइट्स लेते हैं, इसलिए यदि एक छवि में 3000x3000 का संकल्प है, तो इसमें 34 एमबी मेमोरी होगी, 2000 x 2000

Thats जहां समस्या बढ़ जाता है, ऐप्लिकेशन क्रैश 3GS पर 4-5 छवियों को लोड करने के बाद, और iPhone 4 पर 11-13 छवियों

ओवरले की जरूरत के लिए 15 एमबी बिल्कुल पर रखा जा करने के लिए पृष्ठभूमि छवि। वे Google मानचित्र यातायात ओवरले में हमारे पास समान हैं। यह टाइलिंग से इंकार नहीं करता है, लेकिन कार्य अपेक्षाकृत जटिल बनाता है।

मुझे इस समस्या को कैसे संभालना चाहिए?

+1

यह समस्या या तो व्यापार तर्क को टाइलिंग या पुनर्विचार के माध्यम से हल किया जा सकता है। – JehandadK

+0

हां, मैं जानना चाहता हूं कि कोई तरीका है कि मैं बिना किसी समस्या के इस समस्या को संभाल सकता हूं। –

+0

मुझे लगता है कि आप ओवरले और Google मानचित्र दोनों का उल्लेख करते हुए मैपकिट का उपयोग कर रहे हैं। MKOverlayView * एक टाइल दृश्य है और इस तरह आपको शायद टाइलिंग से इंकार नहीं करना चाहिए। एमके फ्रेमवर्क आपके ड्रॉ व्यू पर 'drawMapRect: zoomScale: inContext:' को कॉल करेगा और, सर्वोत्तम अभ्यास के रूप में, आपको * केवल * प्रदान किए गए बाउंडिंग रेक्ट के अनुसार सामग्री को प्रस्तुत करना चाहिए। –

उत्तर

0

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

यदि आप क्वार्ट्जकोर स्तर पर इसे हल करना चाहते हैं, तो इस उद्देश्य के लिए CATiledLayer कक्षा है।

एप्पल संदर्भ: https://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CATiledLayer_class/Introduction/Introduction.html

एप्पल नमूना कोड: https://developer.apple.com/library/mac/#samplecode/CALayerEssentials/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008029

अतिरिक्त जानकारियां: http://red-glasses.com/index.php/tutorials/catiledlayer-how-to-use-it-how-it-works-what-it-does/

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

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