划线时避免颜色空间转换,Mac OS X 10.11 SDK

Mar*_*teg 3 c++ macos core-graphics xcode7 osx-elcapitan

当使用从CGColorSpaceCreateDeviceRGB()返回的色彩空间时,色彩空间转换将应用于任何CGContextDrawImage()调用,与不进​​行此转换的blitting相比,性能降低5-6倍。

为了避免这种色彩空间转换,我们一直在使用通过系统监视器配置文件创建的色彩空间:

CMProfileRef smp = 0;
if (CMGetSystemProfile(&smp) == noErr)
{
    colorSpace = CGColorSpaceCreateWithPlatformColorSpace(smp);
    CMCloseProfile(smp);
}
else
    colorSpace = CGColorSpaceCreateDeviceRGB();
Run Code Online (Sandbox Code Playgroud)

上面的方法效果很好,并且完全禁用了CGContextDrawImage()的颜色空间转换。

从10.6开始,CMGetSystemProfile已被标记为已弃用,但是由于我们没有找到其他避免这些色彩空间转换的可能性,因此我们将其保留在代码中以实现高性能打印。

在10.11 SDK中,删除了ColorSpace API CMGetSystemProfile()。是否有合适的替代品,或关于如何禁用色彩空间转换的替代方法?

Mar*_*teg 5

为了回答我自己的问题,

我最终使用的解决方案是使用CGDisplayCopyColorSpaceCGMainDisplayID函数从主显示ID中获取颜色空间:

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

if (!colorSpace)
    colorSpace = CGColorSpaceCreateDeviceRGB();
Run Code Online (Sandbox Code Playgroud)

这在10.11 SDK中可用,并将创建一个色彩空间,该色彩空间可避免通过调用CGContextDrawImage()进行色彩空间转换。

使用Instruments分析调用栈将显示与我们之前使用的代码相同的调用栈。