blitting 时避免颜色空间转换,Mac OS X 10.11 SDK
Avoiding colorspace transformations when blitting, Mac OS X 10.11 SDK
当使用从 CGColorSpaceCreateDeviceRGB() 返回的色彩空间时,将在任何 CGContextDrawImage() 调用上应用色彩空间转换,导致性能比没有此转换的 blitting 差 5-6 倍。
为避免这种色彩空间转换,我们一直在使用通过系统监视器配置文件创建的色彩空间:
CMProfileRef smp = 0;
if (CMGetSystemProfile(&smp) == noErr)
{
colorSpace = CGColorSpaceCreateWithPlatformColorSpace(smp);
CMCloseProfile(smp);
}
else
colorSpace = CGColorSpaceCreateDeviceRGB();
以上效果很好,完全禁用了 CGContextDrawImage() 的色彩空间转换。
CMGetSystemProfile 自 10.6 以来已被标记为已弃用,但由于我们还没有找到避免这些色彩空间转换的任何其他可能性,因此我们将其保留在我们的代码中以实现高性能 blitting。
在 10.11 SDK 中,删除了 ColorSpace API CMGetSystemProfile()。关于如何禁用色彩空间转换,是否有合适的替代方法或替代方法?
回答我自己的问题,
我最终使用的解决方案是使用函数 CGDisplayCopyColorSpace and CGMainDisplayID:
从主显示 ID 获取颜色 space
colorSpace = ::CGDisplayCopyColorSpace(::CGMainDisplayID());
if (!colorSpace)
colorSpace = CGColorSpaceCreateDeviceRGB();
这在 10.11 SDK 中可用,并将创建一个颜色space,避免调用 CGContextDrawImage() 进行颜色space 转换。
使用 Instruments 分析调用堆栈显示了一个与我们之前使用的代码相同的调用堆栈。
当使用从 CGColorSpaceCreateDeviceRGB() 返回的色彩空间时,将在任何 CGContextDrawImage() 调用上应用色彩空间转换,导致性能比没有此转换的 blitting 差 5-6 倍。
为避免这种色彩空间转换,我们一直在使用通过系统监视器配置文件创建的色彩空间:
CMProfileRef smp = 0;
if (CMGetSystemProfile(&smp) == noErr)
{
colorSpace = CGColorSpaceCreateWithPlatformColorSpace(smp);
CMCloseProfile(smp);
}
else
colorSpace = CGColorSpaceCreateDeviceRGB();
以上效果很好,完全禁用了 CGContextDrawImage() 的色彩空间转换。
CMGetSystemProfile 自 10.6 以来已被标记为已弃用,但由于我们还没有找到避免这些色彩空间转换的任何其他可能性,因此我们将其保留在我们的代码中以实现高性能 blitting。
在 10.11 SDK 中,删除了 ColorSpace API CMGetSystemProfile()。关于如何禁用色彩空间转换,是否有合适的替代方法或替代方法?
回答我自己的问题,
我最终使用的解决方案是使用函数 CGDisplayCopyColorSpace and CGMainDisplayID:
从主显示 ID 获取颜色 spacecolorSpace = ::CGDisplayCopyColorSpace(::CGMainDisplayID());
if (!colorSpace)
colorSpace = CGColorSpaceCreateDeviceRGB();
这在 10.11 SDK 中可用,并将创建一个颜色space,避免调用 CGContextDrawImage() 进行颜色space 转换。
使用 Instruments 分析调用堆栈显示了一个与我们之前使用的代码相同的调用堆栈。