2017-02-28 120 views
0

我用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

要測試的設備或模擬器? – Andrea

+0

設備。在模擬器總是慢。 – Metman

+0

是的,因爲設備是硬件加速的,SIM卡號碼 – Andrea

回答

3

一個CIImageUIImage創建可能需要額外的時間來對圖像數據從內存中拷貝到GPU內存。嘗試加載圖像到GPU的紋理,然後創建使用CIImage(texture:size:flipped:colorSpace:)

確保您只創建紋理一次,而不是在每一個draw(_:)開始這個紋理支持的CIImage

您也可以嘗試:

  • 確保模糊半徑不是太大。高斯模糊是一種昂貴的操作,並且模糊半徑越大花費的時間越長。
  • 使用較小的圖片。如果您需要更大的圖像,則可能需要先縮小圖像,應用模糊,然後縮小(請參閱here以獲取解釋)。將寬度和高度減半將使像素數量減少4倍。
  • UISlider將以每秒60的速率變化。將幀速率降低到30 fps會使您渲染每個圖像的時間增加一倍。
+0

謝謝!我會嘗試。 – Metman