2013-01-07 19 views
6

से हजारों छवियों के साथ फोटो ग्रिड के लिए चिकनी स्क्रॉलिंग प्राप्त करें मेरे पास का उपयोग करके लागू प्रत्येक पंक्ति पर तीन फ़ोटो के साथ है।डिस्क

मेरे पास एक इन-मेमोरी कैश है (एनएससीएच का उपयोग करके) जिसमें 100 छवियों की क्षमता है, इसलिए एक समय में मुझे स्मृति में अधिकतम 100 छवियां मिलेंगी, भले ही मेरे पास डिस्क पर हजारों छवियां दिखें ग्रिड।

मेरी सभी छवियां 4 केबी -20 केबी जेपीईजी हैं।

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

उपयोगकर्ता तेजी से आगे पीछे स्क्रॉल शुरू होता है, मैं दो मामलों है:

  1. अगर मैं मुख्य थ्रेड से छवि लोड कार्य को अलग, मैं अंत तस्वीर ग्रिड पर छवियों लापता, क्योंकि मेरी छवियों को स्मृति में पढ़ने से पहले कोशिकाओं को प्रदर्शित किया जाता है।

    (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
         UIImage *image = getImageFromCacheForImagePath:imagePath; 
         dispatch_async(dispatch_get_main_queue(), ^{ 
          cell.leftGridItem.imageView.image = image; 
         }); 
        }); 
    } 
    
  2. अगर मैं मुख्य थ्रेड पर कार्य लोड हो रहा है छवियों, वहाँ एक हकलाना है। मुझे लगभग 36-45 एफपीएस मिलते हैं।

    (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
        UIImage *image = getImageFromCacheForImagePath:imagePath; 
        cell.leftGridItem.imageView.image = image; 
    } 
    

getImageFromCacheForImagePath:imagePath अगर यह अस्तित्व में नहीं तो, छवि फ़ाइल से भरी हुई है और बाद में उपयोग के लिए NSCache में सेट किया गया है, लेकिन मैं 100

को NSCache की सीमा निर्धारित NSCache से तुरंत छवि हो जाता है

बातें मैंने कोशिश की/फेरबदल:

  1. बचें ग्रिड छवि विचारों के लिए clipsToBounds
  2. पृष्ठभूमि धागे पर छवियों को लोड करना।
  3. NSOperation कतार का उपयोग।
  4. 100 के बैचों में छवियों को लोड करना (काम करता है, लेकिन तेजी से स्क्रॉलिंग के साथ, छवि लोडिंग समय में देरी हुई थी)।

मैं मूल फ़ोटो ऐप के समान अनुभव प्राप्त करने की कोशिश कर रहा हूं।

आपके सुझावों की सराहना की जाती है।

+1

कृपया अपने प्रश्न में कोड की समीक्षा करें। प्रारूपण में मदद की ज़रूरत थी, और जब कुछ समस्याएं सामने आईं तो (कोड '^ {' देखें, ऐसा लगता है कि इसे एक नया कोड ब्लॉक शुरू करना चाहिए लेकिन मुझे सही नहीं लगता है)। हमने इसे सही स्वरूपित करने में आपकी सहायता करने की कोशिश की, लेकिन यह वास्तव में स्पष्ट नहीं है। – ErikE

+0

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

उत्तर

0

मुझे कुछ दिन पहले भी एक ही समस्या का सामना करना पड़ रहा था, इसलिए ओट सोर्स समाधान खोजने के लिए गिटहब सबसे अच्छी जगह है, इसलिए इन लिंक को आज़माएं।

PF-GridView या DTGridView देखें।

भी AQGridView, How to Write a Custom Image Picker like UIImagePicker पर एक नजर डालें,

हमारी आवश्यकता के अनुसार बिट manupulation क्या करने की जरूरत है और यह एक विजेता की तरह काम करता है।

+0

सुझाव के लिए धन्यवाद, समस्या का सामना करना पड़ रहा है डिस्क से स्मृति तक छवियों की चतुराई से और समय पर लोडिंग की दिशा में अधिक है ताकि मैं अधिक मेमोरी का उपयोग नहीं करूंगा लेकिन फिर भी चिकनी स्क्रॉलिंग के साथ ग्रिड व्यू पर छवियां दिखाऊंगा। देशी फ़ोटो ऐप की तरह, यहां तक ​​कि हजारों फ़ोटो के साथ उनके पास चिकनी स्क्रॉलिंग होती है जैसे सभी छवियां स्मृति में होती हैं। मैं यह पता लगाने की कोशिश कर रहा हूं कि वे इसे कैसे प्रबंधित कर रहे हैं। –

0

मैंने 700 से अधिक छवियों के साथ एक चिकनी स्क्रॉल तालिका लागू की है। कुंजी न केवल पृष्ठभूमि में छवियों को लोड करने के लिए बल्कि कंटेनर के अनुरूप पूरी तरह पृष्ठभूमि में आकार बदलने के लिए भी थी।यूआई थ्रेड में इसे करने के लिए अपरिवर्तनीय आकार बदलना बहुत भारी ऑपरेशन है।

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