#ios #swift #uikit #core-graphics
#iOS #swift #uikit #ядро-графика
Вопрос:
Мне нужно объединить два изображения в одно, одно из которых используется в качестве фона. Метод, когда я использую
let a = UIImage(named: "234")
let b = UIImage(named: "720")
let aRect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)
let bRect = CGRect(x: 0, y: 0, width: backgroundImg.size.width, height: backgroundImg.size.height)
...
let render = UIGraphicsImageRenderer(bounds: bRect)
let result = render.image { renderContext in
backgroundImg.draw(in: bRect)
image.draw(in: aRect)
}
return result
Это заняло 2 мс.
но когда я использую
let aPath = Bundle.main.path(forResource: "234@3x", ofType: "png")
let bPath = Bundle.main.path(forResource: "720@3x", ofType: "png")
let a = UIImage(contentsOfFile: aPath!)
let b = UIImage(contentsOfFile: bPath!)
...
let render = UIGraphicsImageRenderer(bounds: bRect)
let result = render.image { renderContext in
backgroundImg.draw(in: bRect)
image.draw(in: aRect)
}
return result
Потребовалось 20 мс, что привело к увеличению времени в 10 раз?
Моя загадка заключается в том, что оба метода загружают два изображения a b в память перед объединением изображений. Но почему существует такая разница в процессе объединения изображений?
Код, подобный этому:
Ответ №1:
Больше времени занимает не компоновка изображений. Это загрузка файла. В первом коде изображения кэшируются в памяти, поэтому для их загрузки после первого раза требуется нулевое время. Во втором коде изображения не кэшируются, поэтому их приходится каждый раз считывать с диска, что происходит медленно.
Комментарии:
1. Спасибо за ваш ответ. Но вы, возможно, неправильно поняли мой код. Мой код записывает изображения в память до того, как два изображения начнут компоноваться. Я думаю, что изображения двух методов находятся в памяти, когда они выполняют метод composition. В приведенном выше вопросе я добавил картинку. Вы можете щелкнуть, чтобы просмотреть его.