Всплески памяти iOS на изображениях CollectionView [высокое разрешение]

У меня есть CollectionView с ячейками, имеющими UIImageView. Некоторые изображения в списке имеют действительно высокое разрешение от 3000 x 2000 и выше. Я использую библиотеку AlamofireImage для отображения и кэширования изображений, но она все еще имеет огромные всплески. я пытался сделать

let filter = AspectScaledToFillSizeFilter(size: imageView.frame.size)
imageView.af_setImage(withURL: url, filter: filter)

Это не имело большого изменения.

Есть ли лучший способ изменить размер / понизить разрешение при загрузке изображения, но перед его отображением, поскольку всплески памяти iOS больше связаны с разрешением, чем с фактическим размером файла изображения.


person Akash Popat    schedule 10.08.2018    source источник
comment
Пожалуйста, попробуйте использовать пул автоматического выпуска вокруг блока кода. Дайте мне знать, если это работает для вас.   -  person Christo Kumar    schedule 10.08.2018
comment
@iChris Я пробовал, но не помогло. Все еще получаю 1-секундные всплески памяти до 300-400 МБ.   -  person Akash Popat    schedule 10.08.2018
comment
Я удалил тег nuke, потому что это приложение для создания визуальных эффектов.   -  person Andy Fedoroff    schedule 11.08.2018


Ответы (1)


Свифт 4.1

Вот как я изменяю размер своих изображений. Вы можете обработать их перед отображением.

// Resize to ~1.5Kx2K resoultion and compress to <200KB (JPEG 0.2)
private func resizePhoto(_ originalPhoto: UIImage) -> UIImage? {
    var size: CGSize
    let scale = UIScreen.main.scale
    if originalPhoto.size.width > originalPhoto.size.height { // Landscape
        size = CGSize(width: 2016/scale, height: 1512/scale)
    } else { // Portrait
        size = CGSize(width: 1512/scale, height: 2016/scale)
    }
    UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
    originalPhoto.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
    let resizedPhoto = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    let scaledPhotoData = UIImageJPEGRepresentation(resizedPhoto!, 0.2)
    //print(">>> Resized data size: \(scaledPhotoData!.count)")
    return UIImage(data: scaledPhotoData)
}
person eharo2    schedule 10.08.2018
comment
1. Разве расширение UIImage не было бы лучше? 2. Есть идеи, сколько мс займет обработка изображения? 3. Разве это не изменит размер всего до 1,5Kx2K? - person Akash Popat; 11.08.2018
comment
Привет @AkashPopat. Добавить это к расширению — хорошая идея, и я также мог бы передать желаемое разрешение в качестве параметра. В этом случае я хотел ограничить размер моего изображения от 1,5 до 2 тысяч пикселей, а общий размер файла — менее 200 КБ (все они были сняты задней камерой). Помимо уменьшения разрешения, коэффициент сжатия (0,2) также помогает уменьшить размер файла. Re: время обработки, это действительно быстро. Не более нескольких миллисекунд, что очень удобно, учитывая время загрузки изображения в полном разрешении. - person eharo2; 17.08.2018