【问题标题】:UIGraphicsBeginImageContext vs CGBitmapContextCreate on iOSiOS 上的 UIGraphicsBeginImageContext 与 CGBitmapContextCreate
【发布时间】:2010-12-15 15:46:12
【问题描述】:

这可能是一个非常愚蠢的问题,但有人能告诉我使用 UIGraphicsBeginImageContext 创建 CGContextRef 和使用 CGBitmapContextCreate 绘制图像之间的区别吗?特别是现在由于 UIKit 绘图是线程安全的,我想知道是否有任何理由使用 CGBitmapContextCreate 而不是 UIGraphicsBeginImageContext。

【问题讨论】:

  • “非常愚蠢的问题”通常不会让你获得 +6 票;)

标签: iphone ios uikit core-graphics


【解决方案1】:

根据 Apple 的 UIKit Function Reference,其封面日期为 2010 年 11 月 15 日,UIGraphicsBeginImageContext 和相关函数仍应仅在主线程上调用。最新的 Xcode 3.2.5 附带的开发人员文档中重复了相同的文本。但是,它对UIGraphicsGetCurrentContext 的报告相同,我现在明确理解它是线程安全的。我的理解是,只有UIGraphicsGetCurrentContext 和 UIImage、UIColor 和 UIFont 类现在是线程安全的,而不是整个 UIKit,但我无法找到明确的参考。

无论如何,UIGraphicsBeginImageContext 是一个 UIKit 包装器,它位于 CGBitmapContextCreate 之上并减少了它的功能。特别是您仅限于具有固定组件顺序的 RGBA 颜色空间图像(尽管它根据 iOS 版本而有所不同),并且无法指定您自己的绘图目标缓冲区。因此,例如,它对于进行一堆 CoreGraphics 合成然后将结果发布到 OpenGL 是没有用的,并且对于将您已经以某种数组形式获得的图形传送到 CoreGraphics 中没有帮助。

但是,在 UIKit 方法支持您需要的功能并且可以安全使用的情况下,CoreGraphics 方法没有固有的优势。

【讨论】:

  • developer.apple.com/library/ios/#releasenotes/General/… 它在发行说明中说绘制到图形上下文是线程安全的,您认为他们的文档只是不一致吗?我尝试从调度队列中调用 UIGraphicsBeginImageContext 并且效果很好。 +1 详细解释,我认为它可能只是一个包装,但不确定,再次感谢。
  • 还有一个问题,根据您的经验,一种方式比另一种方式快吗?我认为降到 CG 级别会更快,但不确定。
  • 这两件事是不一致的——不过我敢打赌发行说明会更准确,因为它们是专门为突出新功能而编写的,而其他文档可能还没有更新。我希望 CoreGraphics 直接调用与 Objective-C 调用相比具有极小的理论性能优势,但没有什么可能重要的。对于 UIGraphicsBeginImageContext,它是一个 C 调用,我不希望差异是可测量的——UIKit 函数只会调用 CoreGraphics,而代价是创建上下文。
  • 创建屏幕外上下文并使用 CG... 调用而不是 UI... 调用在我看来并不难。我会坚持使用 CG... 方法来确保线程安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 2015-06-03
相关资源
最近更新 更多