Производительность ядра графического процессора слишком низкая - PullRequest
0 голосов
/ 24 ноября 2018

Я играл с Core Image Filters и столкнулся со странным тестом.Со следующими 2 функциями;Как следует из названия, одна сложная математическая обработка на процессоре CPU, а другая - на GPU, производительность процессора примерно в сто раз выше производительности GPU.Я попробовал фильтры "CILineOverlay" и "CIPhotoEffectProcess" и измерил время преобразования методом DispatchTime.now().Я делаю что-то неправильно?Или это связано с устаревшей поддержкой OpenGL?

private func apply_cpu(to image:UIImage?, appleFilterName:String) -> UIImage?    {

    guard let image = image, let cgimg = image.cgImage else {
        return nil
    }

    let coreImage = CIImage(cgImage: cgimg)

    let filter = CIFilter(name: "CISepiaTone")
    filter?.setValue(coreImage, forKey: kCIInputImageKey)
    filter?.setValue(0.5, forKey: kCIInputIntensityKey)

    if let output = filter?.value(forKey: kCIOutputImageKey) as? CIImage {
        return UIImage(ciImage: output)
    }

    else {
        return nil
    }
}


private func apply_gpu(to image:UIImage?, appleFilterName:String)-> UIImage?  {

    guard let image = image, let cgimg = image.cgImage else {

        return nil
    }


    let coreImage = CIImage(cgImage: cgimg)


    let start = DispatchTime.now()

    let openGLContext = EAGLContext(api: .openGLES3)
    let context = CIContext(eaglContext: openGLContext!) 


    guard let filter = CIFilter(name: appleFilterName)   else {
        return nil
    }

    if  filter.inputKeys.contains(kCIInputImageKey) {
        filter.setValue(coreImage, forKey: kCIInputImageKey)
    }

    if  filter.inputKeys.contains(kCIInputIntensityKey) {


    }


    if let output = filter.value(forKey: kCIOutputImageKey) as? CIImage {
        let cgimgresult = context.createCGImage(output, from: output.extent)
        return UIImage(cgImage: cgimgresult!)

    }

        return nil

}

}

1 Ответ

0 голосов
/ 24 ноября 2018

Судя по комментариям, проблема заключалась в том, где проводились тесты производительности.Я не могу не подчеркнуть это достаточно при тестировании CoreImage фильтров:

Используйте устройство real , а не симулятор.

Мой опытчто в симуляторе может потребоваться «секунды к минутам», когда на любом устройстве iPhone 5 или более поздней версии, использующем iOS 9+ (возможно, и раньше, в обоих направлениях), будет «почти в реальном времени до миллисекунд».Если вы не видите это на реальном устройстве? - это , что-то не так в коде.

Я не нашел ни учебников, ни книг, ни всего, что подчеркивало бы эту единственную точку.Мой лучший ресурс - Саймон Гладман, который написал превосходный Core Image для Swift (будьте осторожны, это Swift 2) - объясняет многое из того, что, как я верю, происходит, но никогда не подчеркивал, почему это так.

Устройство iOS использует графический процессор.Симулятор не .

Я уверен, что это более сложный процесс и требует оптимизации.Но дело в том, что, хотя вы можете использовать CoreImage в macOS, если вы используете симулятор, вы нацелены на iOS.Поэтому, если проект MacOS, использующий CoreImage, может работать хорошо, если это проект iOS, вам нужно использовать реальное устройство, чтобы почувствовать производительность.

...