#swift #performance #uiimageview #uiimage #uigraphicscontext
#swift #Производительность #uiimageview #uiimage #uigraphicscontext
Вопрос:
У меня есть UIImageView с его изображением myImage (= big UIImage 2000×2000)
Я хочу изменять это изображение 60 раз в секунду примерно на 5000 новых разных пикселей каждый раз (они могут быть везде на изображении, но обычно каждый раз находятся в одной и той же области изображения)
В настоящее время я использую UIGraphicsGetCurrentContext 60 раз в секунду для рисования и сохранения нового изображения с помощью UIGraphicsGetImageFromCurrentImageContext (см. Код ниже).
Есть ли более эффективный способ сделать это?
var newpixels = [Smartpoint]()
... Fill newpixels with new pixels...
DispatchQueue.global().async
{
self.myImage = self.drawOnImage(image :self.myImage, points: newpixels)
DispatchQueue.main.async
{
self.myImageView.image = self.myImage
}
}
...
func drawOnImage(image: UIImage, points : [Smartpoint]) -> UIImage? {
autoreleasepool {
UIGraphicsBeginImageContext(image.size)
// Draw the starting image in the current context as background
image.draw(at: CGPoint.zero)
// Get the current context
let context = UIGraphicsGetCurrentContext()!
context.setBlendMode(.normal)
for point in points
{
... make something with the point ...
}
context.drawPath(using: .stroke)
// Save the context as a new UIImage
let myImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
// Return modified image
return myImage
}
}
Комментарии:
1. Похоже, здесь потребуется металл и ускорение.