当使用从CGColorSpaceCreateDeviceRGB()返回的颜色空间时,将对任何CGContextDrawImage()调用应用颜色空间转换,导致比不进行此转换的闪存性能差5-6倍。
为了避免这种颜色空间转换,我们一直在使用用系统监视器配置文件创建的颜色空间:
CMProfileRef smp = 0;
if (CMGetSystemProfile(&smp) == noErr)
{
colorSpace = CGColorSpaceCreateWithPlatformColorSpace(smp);
CMCloseProfile(smp);
}
else
colorSpace = CGColorSpaceCreateDeviceRGB();上面的操作很好,并且完全禁用了CGContextDrawImage()的颜色空间转换。
自10.6以来,CMGetSystemProfile已被标记为“不推荐”,但由于我们没有发现任何其他可能避免这些颜色空间转换,所以我们将其保留在代码中,以便进行高性能闪存。
在10.11SDK中,删除了ColorSpace API CMGetSystemProfile()。在如何禁用颜色空间转换方面,是否有合适的替代方法或替代方法?
发布于 2015-10-12 08:49:23
回答我自己的问题,
我最后使用的解决方案是使用CGDisplayCopyColorSpace和CGMainDisplayID函数,从主显示ID获取颜色空间。
colorSpace = ::CGDisplayCopyColorSpace(::CGMainDisplayID());
if (!colorSpace)
colorSpace = CGColorSpaceCreateDeviceRGB();这在10.11SDK中是可用的,它将创建一个颜色空间,通过调用CGContextDrawImage()来避免颜色空间转换。
通过分析仪器调用堆栈,可以看到一个与我们之前使用的代码相同的调用堆栈。
https://stackoverflow.com/questions/33075557
复制相似问题