У меня есть приложение, написанное на RXSwift, которое обрабатывает данные HealthKit за 500+ дней, чтобы нарисовать диаграмму для пользователя.
Изображение диаграммы рисуется постепенно, используя код ниже. Начиная с черного экрана, предыдущее изображение рисуется в графическом контексте, затем новый сегмент рисуется поверх этого изображения с определенным смещением. Объединенное изображение сохраняется, и процесс повторяется более 70 раз. Каждый раз изображение сохраняется, поэтому пользователь видит обновление. В результате получается одиночное графическое изображение , которое пользователь может экспортировать из приложения.
Даже с пулом autorelease
я вижу всплески использования памяти до 1 Гб, что не позволяет мне делать это другие ресурсоемкие обработки.
Как оптимизировать пошаговое рисование очень большого (1440 × 5000 пикселей) изображения?
Когда изображение отображается или сохраняется в 3-кратном масштабе, на самом деле это 4320 × 15360.
Есть ли лучший способ, чем пытаться рисовать поверх изображения?
autoreleasepool {
//activeEnergyCanvas is custom data processing class
let newActiveEnergySegment = activeEnergyCanvas.draw(in: CGRect(x: 0, y: 0, width: 1440, height: days * 10), with: energyPalette)
let size = CGSize(width: 1440, height: height)
UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
//draw existing image
self.activeEnergyImage.draw(in: CGRect(origin: CGPoint(x: 0, y: 0),
size: size))
//calculate where to draw smaller image over larger one
let offsetRect = CGRect(origin: CGPoint(x: 0, y: offset * 10),
size: newActiveEnergySegment.size)
newActiveEnergySegment.draw(in: offsetRect)
//get the combined image
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
//assign combined image to be displayed
if let unwrappedImage = newImage {
self.activeEnergyImage = unwrappedImage
}
}