से हजारों छवियों के साथ फोटो ग्रिड के लिए चिकनी स्क्रॉलिंग प्राप्त करें मेरे पास का उपयोग करके लागू प्रत्येक पंक्ति पर तीन फ़ोटो के साथ है।डिस्क
मेरे पास एक इन-मेमोरी कैश है (एनएससीएच का उपयोग करके) जिसमें 100 छवियों की क्षमता है, इसलिए एक समय में मुझे स्मृति में अधिकतम 100 छवियां मिलेंगी, भले ही मेरे पास डिस्क पर हजारों छवियां दिखें ग्रिड।
मेरी सभी छवियां 4 केबी -20 केबी जेपीईजी हैं।
तो इस आधारभूत संरचना के साथ, जब उपयोगकर्ता फोटो ग्रिड के माध्यम से स्क्रॉल करता है तो छवियों को एनएससीएच से लगातार लोड और अनलोड किया जाता है। सामान्य स्क्रॉलिंग के साथ सबकुछ अच्छा दिखता है, मुझे लगभग 55-58 एफपीएस मिलते हैं।
उपयोगकर्ता तेजी से आगे पीछे स्क्रॉल शुरू होता है, मैं दो मामलों है:
अगर मैं मुख्य थ्रेड से छवि लोड कार्य को अलग, मैं अंत तस्वीर ग्रिड पर छवियों लापता, क्योंकि मेरी छवियों को स्मृति में पढ़ने से पहले कोशिकाओं को प्रदर्शित किया जाता है।
(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; }); }); }
अगर मैं मुख्य थ्रेड पर कार्य लोड हो रहा है छवियों, वहाँ एक हकलाना है। मुझे लगभग 36-45 एफपीएस मिलते हैं।
(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UIImage *image = getImageFromCacheForImagePath:imagePath; cell.leftGridItem.imageView.image = image; }
getImageFromCacheForImagePath:imagePath
अगर यह अस्तित्व में नहीं तो, छवि फ़ाइल से भरी हुई है और बाद में उपयोग के लिए NSCache में सेट किया गया है, लेकिन मैं 100
NSCache
की सीमा निर्धारित NSCache से तुरंत छवि हो जाता है
बातें मैंने कोशिश की/फेरबदल:
- बचें ग्रिड छवि विचारों के लिए
clipsToBounds
। - पृष्ठभूमि धागे पर छवियों को लोड करना।
NSOperation
कतार का उपयोग।- 100 के बैचों में छवियों को लोड करना (काम करता है, लेकिन तेजी से स्क्रॉलिंग के साथ, छवि लोडिंग समय में देरी हुई थी)।
मैं मूल फ़ोटो ऐप के समान अनुभव प्राप्त करने की कोशिश कर रहा हूं।
आपके सुझावों की सराहना की जाती है।
कृपया अपने प्रश्न में कोड की समीक्षा करें। प्रारूपण में मदद की ज़रूरत थी, और जब कुछ समस्याएं सामने आईं तो (कोड '^ {' देखें, ऐसा लगता है कि इसे एक नया कोड ब्लॉक शुरू करना चाहिए लेकिन मुझे सही नहीं लगता है)। हमने इसे सही स्वरूपित करने में आपकी सहायता करने की कोशिश की, लेकिन यह वास्तव में स्पष्ट नहीं है। – ErikE
मुझे आश्चर्य है कि क्या वे आयात समय पर थंबनेल ऑफ-लाइन उत्पन्न नहीं कर रहे हैं, और फिर थंबनेल के छोटे आकार में उन्हें मुख्य थ्रेड लोडिंग के लिए एक महत्वपूर्ण लाभ मिलता है। –