Предотвращение преобразований цветового пространства при блитии, Mac OS X 10.11 SDK

При использовании цветового пространства, возвращенного из 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 () удален. Есть ли подходящая замена или альтернативный метод, как отключить преобразования цветового пространства?

2

Решение

Чтобы ответить на мой собственный вопрос,

решение, которое я использовал в итоге, состоит в том, чтобы получить цветовое пространство из идентификатора основного дисплея, используя функции CGDisplayCopyColorSpace а также CGMainDisplayID:

colorSpace = ::CGDisplayCopyColorSpace(::CGMainDisplayID());

if (!colorSpace)
colorSpace = CGColorSpaceCreateDeviceRGB();

Это доступно с 10.11 SDK и создаст цветовое пространство, которое избегает преобразований цветового пространства с вызовами CGContextDrawImage ().

Анализ стека вызовов с помощью Instruments показывает стек вызовов, идентичный предыдущему коду, который мы использовали.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]