我有一個,每行有三張照片,使用UITableView
實施。使用光盤上的成千上萬的圖像實現光柵捲動
我有一個內存緩存(使用NSCache),它具有100張圖像的容量,所以有一次我將在內存中存儲至多100張圖像,即使我有成千上萬張光盤上的圖像顯示網格。
我所有的圖像都是4KB-20KB的JPEG。
因此,使用此基礎架構時,用戶滾動瀏覽照片網格時,圖像會從NSCache連續加載和卸載。通常滾動一切看起來不錯,我得到55-58 fps左右。
當用戶開始滾動更快來回,我有兩種情況:
如果我單獨拿出從主線程的圖像加載任務,我結束了在照片網格圖像丟失,因爲我在將圖像讀入內存之前顯示單元格。
(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-45fps左右。
(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UIImage *image = getImageFromCacheForImagePath:imagePath; cell.leftGridItem.imageView.image = image; }
getImageFromCacheForImagePath:imagePath
立即獲取圖像從NSCache如果它存在,如果沒有,將圖像從文件加載並設置成NSCache供以後使用,但我設置的NSCache
極限爲100
事情我試過/扭捏:
- 避免
clipsToBounds
電網圖像視圖。 - 在後臺線程中加載圖像。
- 使用
NSOperation
隊列。 - 以100個批次加載圖像(有效,但快速滾動,圖像加載時間延遲)。
我試圖達到與原生照片應用程序相同的感覺。
您的建議非常感謝。
請檢查您的問題中的代碼。格式化需要幫助,並在完成後發現一些問題(請參閱代碼'^ {',它看起來應該開始一個新的代碼塊,但對我來說似乎不正確)。我們試圖幫助您將其格式化,但這並不明確。 – ErikE
我不知道他們是不是像導入時間一樣離線生成縮略圖,然後縮略圖的小尺寸爲主線程加載提供了顯着的優勢。 –