Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 核心图像慢速渲染_Ios_Swift_Rendering_Glkview - Fatal编程技术网

Ios 核心图像慢速渲染

Ios 核心图像慢速渲染,ios,swift,rendering,glkview,Ios,Swift,Rendering,Glkview,我用ViewController、GLKView和UISlider创建了测试应用程序。 滑块更改选定过滤器中的值。渲染图像非常慢。 我的代码怎么了 GLKview的测试级别: import UIKit import CoreImage import GLKit class CustomGLView: GLKView { //test filters let clampFilter = CIFilter(name: "CIAffineClamp")! let blurF

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

UIImage
创建
CIImage
可能需要额外的时间将图像数据从内存复制到GPU内存。尝试将图像加载到GPU纹理中,然后使用
CIImage(纹理:大小:翻转:颜色空间:)

确保只创建一次纹理,而不是在每次
绘制(:)
开始时创建

您也可以尝试:

  • 确保模糊半径不是太大。高斯模糊是一种昂贵的操作,模糊半径越大,所需时间越长
  • 使用较小的图像。如果需要较大的图像,可能需要先缩小图像,应用模糊,然后再放大(有关说明,请参阅)。将宽度和高度减半将使像素数减少4倍
  • UISlider
    将以每秒60次的速率更改。将帧速率降低到30 fps将使渲染每个图像的时间增加一倍

UIImage
创建
CIImage
可能需要额外的时间将图像数据从内存复制到GPU内存。尝试将图像加载到GPU纹理中,然后使用
CIImage(纹理:大小:翻转:颜色空间:)

确保只创建一次纹理,而不是在每次
绘制(:)
开始时创建

您也可以尝试:

  • 确保模糊半径不是太大。高斯模糊是一种昂贵的操作,模糊半径越大,所需时间越长
  • 使用较小的图像。如果需要较大的图像,可能需要先缩小图像,应用模糊,然后再放大(有关说明,请参阅)。将宽度和高度减半将使像素数减少4倍
  • UISlider
    将以每秒60次的速率更改。将帧速率降低到30 fps将使渲染每个图像的时间增加一倍

您是在设备上测试还是在模拟器?设备上测试。在模拟器中总是很慢。是的,因为设备是硬件加速的,sim noHello@Metman,我在使用CIFilter时发现了相同的问题,您解决了上述问题吗?如何解决?Hello@GOPAL VASANI。只需调整图像大小即可进行渲染。渲染完成后,将更改应用于原始图像。我用了一个CIContext。你们是在设备上测试还是在模拟器上测试?设备。在模拟器中总是很慢。是的,因为设备是硬件加速的,sim noHello@Metman,我在使用CIFilter时发现了相同的问题,您解决了上述问题吗?如何解决?Hello@GOPAL VASANI。只需调整图像大小即可进行渲染。渲染完成后,将更改应用于原始图像。我用了一个CIContext。