在我的iOS應用程序中,我有UICollectionView
,它顯示大約1200個小(35x35點)圖像。這些圖像存儲在應用程序包中。如何提高包含大量小圖片的UCollectionView的性能?
我正確地重用UICollectionViewCell
秒,但仍然有取決於我如何處理圖像加載性能問題:
我的應用程序是應用程序擴展和那些具有有限內存(40 MB在這種情況下)。將所有1200張圖片放入資產目錄並使用
UIImage(named: "imageName")
加載它們導致內存崩潰 - 系統緩存的圖像填滿了內存。在某些時候,應用程序需要分配更大的內存部分,但由於緩存的圖像,這些部分不可用。操作系統不是觸發內存警告和清理緩存,而是殺死了應用程序。我改變了避免圖像緩存的方法。我把圖像放到我的項目中(不是作爲目錄),我現在用
NSBundle.mainBundle().pathForResource("imageName", ofType: "png")
加載它們。該應用程序不再因內存錯誤而崩潰,但單個圖像的加載需要更長的時間,即使在最新的iPhone上,快速滾動也是滯後的。
我在圖像上完全控制研究,並可以將它們例如以.JPEG或優化他們(我已經嘗試過ImageOptim並沒有成功一些其他的選擇)。
我該如何解決這兩個性能問題?
編輯1:
我也試過在後臺線程加載圖像。這是從我的UICollectionViewCell
子類代碼:
private func loadImageNamed(name: String) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { [weak self]() in
let image = bundle.pathForResource(name, ofType: "png")?.CGImage
if name == self?.displayedImageName {
dispatch_async(dispatch_get_main_queue(), {
if name == self?.displayedImageName {
self?.contentView.layer.contents = image
}
})
}
})
}
滾動到某一位置以編程時,這使得滾動平滑而不消耗額外的存儲器,用於緩存但(例如,當UICollectionView
滾動到頂部)它會導致另一個問題 :在滾動動畫過程中,圖像不會更新(滾動速度太快無法加載),滾動完成後會顯示錯誤的圖像以顯示秒數 - 並且一個接一個地替換爲正確的圖像。這在視覺上非常令人不安。
編輯2:
我不能組小圖像成更大組成的圖像,並通過this answer的建議顯示的那些。
原因:
- 考慮不同的屏幕大小和方向。必須爲它們中的每一個預先製作圖像,這將使應用下載巨大。
- 小圖像可以按不同順序顯示,其中一些可能在某些情況下隱藏。我完全無法爲每種可能的組合和順序預先分解圖像。
你需要某種形式的緩存可以從您的需求,標準的圖像填充,但隨後快速訪問一次的事情是建立和運行,從而滾動等是光滑的。以下鏈接似乎提供了這樣的機制。看起來它使用內存映射文件並避免了大部分開銷。也許值得一瞧? https://開頭github上。com/path/FastImageCache –