2017-02-28 7 views
0

私はViewController、GLKView、およびUISliderでテストアプリケーションを作成しました。 選択したフィルタのスライダの変更値。レンダリングイメージは非常に遅いです。 私のコードで何が問題になっていますか? GLKviewのCore Imageスローレンダリング

Testクラス:

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 no – Andrea

答えて

3

UIImageからCIImageを作成すると、GPUメモリにメモリから画像データをコピーするために余分な時間を必要とするかもしれません。 GPUテクスチャにイメージをロードしてから、CIImage(texture:size:flipped:colorSpace:)

draw(_:)の先頭ではなく、テクスチャを1回だけ作成していることを確認してください。

また、試みることができる:

  • をぼかし半径が大きすぎないことを確認作ります。ガウスぼかしは高価な処理であり、ぼかし半径が大きくなるほど時間がかかります。
  • 小さい画像を使用する。より大きな画像が必要な場合は、最初に画像の縮尺を変更し、ぼかしを適用してからスケールアップすることができます(詳細はhereを参照)。幅と高さを半分にすると、ピクセル数が4倍に減少します。
  • は毎秒60の割合で変化します。フレームレートを30 fpsにすると、各画像をレンダリングする時間が倍になります。
+0

ありがとう!試してみます。 – Metman

関連する問題