насколько эффективно изменять 5000 пикселей большого пользовательского изображения 60 раз в секунду с помощью Swift

#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. Похоже, здесь потребуется металл и ускорение.