c++ - 避免位 block 传送时的色彩空间转换,Mac OS X 10.11 SDK

标签 c++ macos core-graphics xcode7 osx-elcapitan

当使用从 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/

相关文章:

performance - 如何清除 MacOSX 上的目录/inode 缓存

c++ - 从 url 读取 xml 行

c++ - 跳转二分查找有直观的解释吗?

c++ - C++中运算符的函数指针

php - 在 OSX 上读取 p12 证书时写入权限错误 (OSStatus -61)

ios - UIView 上的橡皮擦效果

c++ - 调用成员 C++ 函数但 C 函数具有相同的名称

macos - .emacs 识别操作系统的代码?

ios - 如何使用 cornerradius 去除 CALayer 周围的丑陋边框?

ios - 从照片库中裁剪 UIImage 与 iPhone 相机