在绘制视图背景时,最佳做法是什么?使用 NSColor 和 NSRectfill 还是使用 CGColorRef 和 CGContextSetFillColorWithColor 之类的 Core Foundation 对象?使用核心基础对象时是否有任何性能优势?
1 回答
需要考虑的因素
便于使用
AppKit 绘图 API,包括NSRectFill
,通常更容易,因为传递的内容更少。创建 NSColors也比CGColors (除了white 和 black)更容易。
线程安全
由于您没有使用 AppKit API 传递上下文(所有绘图都转到当前上下文),因此除了主线程之外,没有办法安全地在任何线程上进行 AppKit 绘图。
您也不应该使用源自 AppKit 的上下文进行 CG 绘图。如果您想在另一个线程上绘图,请创建您自己的上下文,然后从中捕获图像,然后使用调度或主线程执行将其扔回主线程。
性能优势
假设为零。
绘画中昂贵的部分是绘画。阴影最大,其次是光栅化路径(尤其是文本)。栅格的合成(例如,CGImages 和 NSBIRs)比您预期的要快。
相比之下,从 NS* 绘图 API 切换到 CG* 是微不足道的。根据您在 Instruments 中的发现,将优化时间花在其他地方。
大约唯一值得进行这种更改的地方是(不出所料)文本:Core Text 可能比 AppKit 文本绘制速度快一点,但可以测量。任何一个的最佳情况是一个不变的字符串,你可以保留并重复使用:在 Core Text 的情况下,你会保留框架设置器和/或框架;使用 AppKit 绘图,您只能保留属性字符串。如果您的字符串经常更改,则无济于事:无论哪种方式绘制它都会很昂贵。但是,同样,首先要配置文件,在您证明它在您的应用程序中很重要之前不要担心这一点。
可移植性
CG 代码可以在 Mac 和 iOS 上使用,几乎不需要修改。AppKit 绘图代码仅适用于存在 AppKit 的地方:在 Mac 上。
判决
使用 AppKit 绘图,除非您想移植到 iOS(或维护现有的 iOS 版本),在这种情况下,请使用 Core Graphics 并在两者上尽可能多地重用绘图代码。
(当然,假设代码在两个平台上绘制相同的东西。如果在每个平台上绘制不同,它应该只是两个单独的代码块,在这种情况下,每个都可以使用特定于平台的 API,因为每个都是无论如何都是特定于平台的。)