2017-03-17 7 views
0

私は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) 
        } 
       } 
      } 
     }) 
    } 
} 
} 
+1

あなたがアプリのメモリ使用量について話しているとき、あなたは正しいRAMを参照していますか?イメージが200kbであるという理由だけで、200kbのRAMを使用して表示されるわけではありません。 –

+0

これは正しいRAMです。もちろん、私はそれを表示するために、より多くのリソースを使用する必要があることを理解している画像の最大1500倍のサイズですか?さらに、キャッシュ自体のサイズは19イメージから約550MBです。キャッシュをクリアすると、100MBのRAMが使用されます。 –

+0

イメージを表示するには、格納されたバイトから表示されたピクセルに変換する必要があります。したがって、3000キロバイトの画像を200キロビットに圧縮しても、まだ6メガピクセルに解凍する必要があります。各ピクセルが4バイト(rgba)の場合、それは24MBです。それらの19をロードし、あなたが話している大まかな範囲に入っている。 –

答えて

0

フランクはコメントとして、画像はイメージのためだけのデータよりも多くのスペースを占有し、表示される:ここでは?:

クラスTripOverviewCellを助けるかもしれないいくつかのコードです。私のエラーは、UIImagesをキャッシュしていたという事実にあります。これは完全に表示されたイメージです。代わりに、私はデータをキャッシュし、必要な場所からそのデータからイメージを作成する必要がありました。メモリ使用量は550MBから約20MBに減少しています。

関連する問題