私はFirebaseを使用してアプリケーションのホストイメージをダウンロードしています。 Firebaseの各画像は200kb〜400kbの範囲にあり、collectionViewをスクロールするときに一度に約12をダウンロードします。画像をダウンロードするVCを起動すると、約100MBのメモリを使用してから650MBのメモリに、合計19枚の画像をダウンロードできます。質問の画像はJPEGで、Firebaseにアップロードする前にかなり圧縮されています。これらの画像はNSCacheに保存され、キャッシュをクリアするとメモリ使用量は約100MBに戻ります。Firebaseからダウンロードした画像は、サイズが200-400kbの場合、何とか28MBのメモリを占有します。
何が起こっているのですか? UICollectionViewCell {
@IBOutlet weak var imageView: UIImageView!
func updateUI(photo:Photo, image:UIImage? = nil) {
//Call when preparing to show image
if image != nil {
print("Loaded from cache")
imageView.image = image
photo.assignImage(image: image!)
} else {
let url = photo.imageUrl
let ref = FIRStorage.storage().reference(forURL: url)
ref.data(withMaxSize: 5*1024*1024, completion: { [weak self] (data, error) in
if error != nil {
print("Unable to download image")
} else {
print("Image downloaded")
if let imageData = data {
if let image = UIImage(data: imageData) {
self?.imageView.image = image
photo.assignImage(image: image)
TripsVC.imageCache.setObject(image, forKey: photo.uid as NSString)
}
}
}
})
}
}
}
あなたがアプリのメモリ使用量について話しているとき、あなたは正しいRAMを参照していますか?イメージが200kbであるという理由だけで、200kbのRAMを使用して表示されるわけではありません。 –
これは正しいRAMです。もちろん、私はそれを表示するために、より多くのリソースを使用する必要があることを理解している画像の最大1500倍のサイズですか?さらに、キャッシュ自体のサイズは19イメージから約550MBです。キャッシュをクリアすると、100MBのRAMが使用されます。 –
イメージを表示するには、格納されたバイトから表示されたピクセルに変換する必要があります。したがって、3000キロバイトの画像を200キロビットに圧縮しても、まだ6メガピクセルに解凍する必要があります。各ピクセルが4バイト(rgba)の場合、それは24MBです。それらの19をロードし、あなたが話している大まかな範囲に入っている。 –