我使用ViewController,GLKView和UISlider创建了测试应用程序。 滑块更改所选滤镜中的值。渲染图像非常慢。 我的代码出了什么问题?
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
}
}
答案 0 :(得分:4)
从CIImage
创建UIImage
可能需要额外的时间将图像数据从内存复制到GPU内存。尝试将图像加载到GPU纹理中,然后使用CIImage
CIImage(texture:size:flipped:colorSpace:)
确保您只创建纹理一次,而不是在每个draw(_:)
的开头。
您也可以尝试:
UISlider
将以每秒60的速度变化。将帧速率降低到30 fps将使您渲染每个图像的时间增加一倍。