Я пишу приложение, в котором широко используются фильтры CoreImage + пользовательские шейдеры. Обычный случай:
- Загрузка и кэширование большого RAW-файла с жесткого диска через
CIFilter(imageURL)
- Применение коррекций (оттенок, температура, экспозиция)
- Применение случайных предопределенных фильтров CoreImage
- Применение пользовательских шейдеров
- Отобразить все до
MTLTexture
- Визуализация из MTLTexture на экран
- Перейти к шагу 2.
Теперь мы наблюдали на различных MacBook (например, в конце 2014 года), что этот код работает быстрее, если целевой MTLDevice - это интегрированный графический процессор Intel, а не высокопроизводительный Radeon, подключенный к MBP.
Есть идеи, почему это так? Я ожидал бы, что Radeon будет намного быстрее.
редактирование:
Протестированные карточки:
- "Radeon Pro 460 4096 МБ" против "Intel HD Graphics 530 1536 МБ"
- «NVIDIA GeForce GT 750M 2 ГБ GDDR5» против «Intel Iris Pro Graphics»
Упрощенная версия кода, который мы используем:
let filter = CIFilter(imageURL: urlToRawFile20MBLarge)
class Renderer: MTKView {
override func draw() {
filter.setValue(temp, forKey: kCIInputNeutralTemperatureKey)
let image: CIImage = filter.cropped(to: rect)
// uses CIFilter(name: "CIGaussianBlur").outputImage
.applyBlurFilter(radius: radius)
.applyCustomShader1(param: x)
.applyCustomShader2(param: y)
// ... create command buffer and `CIRenderDestination`
do {
try ciContext.startTask(toClear: dest)
try ciContext.startTask(toRender: image, to: dest)
} catch {
log(error)
}
if let drawable = currentDrawable {
commandBuffer.present(drawable)
}
}
}