当使用从 CGColorSpaceCreateDeviceRGB() 返回的颜色空间时,颜色空间转换将应用于任何 CGContextDrawImage() 调用,导致性能比没有此转换的位图传输差 5-6 倍。
为了避免这种色彩空间转换,我们一直使用通过系统显示器配置文件创建的色彩空间:
CMProfileRef smp = 0;
if (CMGetSystemProfile(&smp) == noErr)
{
colorSpace = CGColorSpaceCreateWithPlatformColorSpace(smp);
CMCloseProfile(smp);
}
else
colorSpace = CGColorSpaceCreateDeviceRGB();
上面的方法运行良好,并且完全禁用了 CGContextDrawImage() 的颜色空间转换。
自 10.6 起,CMGetSystemProfile 已被标记为已弃用,但由于我们没有找到任何其他可能性来避免这些颜色空间转换,因此我们将其保留在代码中以实现高性能位 block 传送。
在 10.11 SDK 中,删除了 ColorSpace API CMGetSystemProfile()。是否有合适的替代品或替代方法来禁用色彩空间转换?
最佳答案
回答我自己的问题,
我最终使用的解决方案是使用函数CGDisplayCopyColorSpace从主显示器ID获取颜色空间。和 CGMainDisplayID :
colorSpace = ::CGDisplayCopyColorSpace(::CGMainDisplayID());
if (!colorSpace)
colorSpace = CGColorSpaceCreateDeviceRGB();
这在 10.11 SDK 中可用,并将创建一个色彩空间,避免通过调用 CGContextDrawImage() 进行色彩空间转换。
使用 Instruments 分析调用堆栈显示了一个与我们之前使用的代码相同的调用堆栈。
关于c++ - 避免位 block 传送时的色彩空间转换,Mac OS X 10.11 SDK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33075557/