Ich benutze Firebase, um Bilder für meine App zu hosten und herunterzuladen. Jedes Bild auf Firebase reicht von 200 KB bis 400 KB, und der Benutzer lädt etwa 12 gleichzeitig herunter, wenn er durch eine CollectionView blättert. Wenn ich den VC starte, der die Bilder herunterlädt, geht meine App von der Verwendung von ungefähr 100 MB Speicher zu 650 MB Speicher von dem Herunterladen von 19 Bildern insgesamt. Die Bilder in Fragen sind JPEGs und wurden ziemlich stark komprimiert, bevor sie in Firebase hochgeladen werden. Diese Bilder werden in einem NSCache gespeichert, und wenn der Cache gelöscht wird, wird die Speicherbelegung wieder auf etwa 100 MB reduziert.Bilder, die von Firebase heruntergeladen werden, nehmen irgendwie 28 MB Speicher ein Stück, wenn sie nur 200-400kb groß sind
Was ist los? Hier ist ein Code, der
Klasse TripOverviewCell helfen ?: kann: 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)
}
}
}
})
}
}
}
Wenn Sie über die Speichernutzung in der App sprechen, beziehen Sie sich auf RAM richtig? Nur weil ein Bild 200kb ist, bedeutet das nicht, dass es 200kb RAM verwendet, um es anzuzeigen –
Das ist richtig, RAM. Natürlich verstehe ich, dass es mehr Ressourcen verwenden muss, um es anzuzeigen, aber bis zu 1500x die Größe des Bildes? Darüber hinaus ist die Größe des Caches selbst etwa 550 MB von 19 Bildern. Wenn Sie den Cache löschen, wird er auf 100 MB RAM zurückgesetzt. –
Um ein Bild anzuzeigen, muss es von den gespeicherten Bytes in die angezeigten Pixel konvertiert werden. Wenn Sie also ein 3000x2000 Bild haben, das Sie auf 200Kb komprimiert haben, muss es noch in 6 Megapixel dekomprimiert werden. Wenn jedes Pixel 4 Byte (rgba) ist, sind das 24 MB. Lade 19 davon und du kommst in den groben Bereich, von dem du sprichst. –