При использовании цветового пространства, возвращенного из CGColorSpaceCreateDeviceRGB (), преобразование цветового пространства будет применено к любому вызову CGContextDrawImage (), что приведет к снижению производительности в 5-6 раз по сравнению с блиттингом без этого преобразования.
Чтобы избежать этого преобразования цветового пространства, мы использовали цветовое пространство, созданное с помощью профиля системного монитора:
CMProfileRef smp = 0;
if (CMGetSystemProfile(&smp) == noErr)
{
colorSpace = CGColorSpaceCreateWithPlatformColorSpace(smp);
CMCloseProfile(smp);
}
else
colorSpace = CGColorSpaceCreateDeviceRGB();
Вышеупомянутое работает хорошо и полностью отключает преобразования цветового пространства для CGContextDrawImage ().
CMGetSystemProfile помечен как устаревший с 10.6, но поскольку мы не нашли никакой другой возможности избежать этих преобразований цветового пространства, мы сохранили его в нашем коде для высокопроизводительного блитинга.
В SDK 10.11 API-интерфейс ColorSpace CMGetSystemProfile () удален. Есть ли подходящая замена или альтернативный метод, как отключить преобразования цветового пространства?
Чтобы ответить на мой собственный вопрос,
решение, которое я использовал в итоге, состоит в том, чтобы получить цветовое пространство из идентификатора основного дисплея, используя функции CGDisplayCopyColorSpace а также CGMainDisplayID:
colorSpace = ::CGDisplayCopyColorSpace(::CGMainDisplayID());
if (!colorSpace)
colorSpace = CGColorSpaceCreateDeviceRGB();
Это доступно с 10.11 SDK и создаст цветовое пространство, которое избегает преобразований цветового пространства с вызовами CGContextDrawImage ().
Анализ стека вызовов с помощью Instruments показывает стек вызовов, идентичный предыдущему коду, который мы использовали.
Других решений пока нет …