gpt4 book ai didi

ios - Core Image 渲染缓慢

转载 作者:行者123 更新时间:2023-11-28 10:14:59 25 4
gpt4 key购买 nike

我使用 ViewController、GLKView 和 UISlider 创建了测试应用程序。所选过滤器中的 slider 更改值。渲染图像非常慢。我的代码有什么问题?

GLKview的测试类:

import UIKit
import CoreImage
import GLKit

class CustomGLView: GLKView {
//test filters
let clampFilter = CIFilter(name: "CIAffineClamp")!
let blurFilter = CIFilter(name: "CIGaussianBlur")!
let ciContext:CIContext

override init(frame: CGRect) {
let glContext = EAGLContext(api: .openGLES2)
ciContext = CIContext(
eaglContext: glContext!,
options: [
kCIContextWorkingColorSpace: NSNull()
]
)
super.init(frame: frame, context: glContext!)
enableSetNeedsDisplay = true
}

required init(coder aDecoder: NSCoder) {
let glContext = EAGLContext(api: .openGLES2)
ciContext = CIContext(
eaglContext: glContext!,
options: [
kCIContextWorkingColorSpace: NSNull()
]
)
super.init(coder: aDecoder)!
context = glContext!
enableSetNeedsDisplay = true
}

var inputImage: UIImage? {
didSet {
inputCIImage = inputImage.map { CIImage(image: $0)! }
}
}

var blurRadius: Float = 0 {
didSet {
blurFilter.setValue(blurRadius, forKey: "inputRadius")
setNeedsDisplay()
}
}

var inputCIImage: CIImage? {
didSet { setNeedsDisplay() }
}

override func draw(_ rect: CGRect) {
if let inputCIImage = inputCIImage {
clampFilter.setValue(inputCIImage, forKey: kCIInputImageKey)
blurFilter.setValue(clampFilter.outputImage!, forKey: kCIInputImageKey)
let rect = CGRect(x: 0, y: 0, width: drawableWidth, height: drawableHeight)
ciContext.draw(blurFilter.outputImage!, in: rect, from: inputCIImage.extent)
}
}
}

我如何更改 CIFilter 中的值:

import UIKit
import GLKit
import CoreImage

class ViewController: UIViewController {
//image
let imageOriginal = UIImage(named: "pic_2")
//my GLKView
@IBOutlet weak var glView: CustomGLView!

override func viewDidLoad() {
super.viewDidLoad()
//test image
self.glView.inputImage = self.imageOriginal

}

@IBAction func mySlider(_ sender: UISlider) {

self.glView.blurRadius = sender.value
}
}

最佳答案

UIImage 创建一个 CIImage 可能需要额外的时间将图像数据从内存复制到 GPU 内存。尝试将图像加载到 GPU 纹理中,然后使用 CIImage(texture:size:flipped:colorSpace:)

创建一个由该纹理支持的 CIImage

确保你只创建一次纹理,而不是在每次 draw(_:) 的开始。

你也可以试试:

  • 确保模糊半径不会太大。高斯模糊是一项昂贵的操作,模糊半径越大,所需时间越长。
  • 使用较小的图片。如果您需要更大的图像,您可能需要先缩小图像,应用模糊,然后再放大(参见 here 的解释)。将宽度和高度减半会将像素数减少 4 倍。
  • UISlider 将以每秒 60 次的速度变化。将帧速率降低到 30 fps 将使您渲染每张图像的时间翻倍。

关于ios - Core Image 渲染缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42503227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com