查看绘图 - 核心基础与NSColor

时间:2013-09-16 09:19:07

标签: objective-c cocoa custom-view

在绘制视图背景时,最佳做法是什么?使用NSColor和NSRectfill或使用Core Foundation对象,如CGColorRef和CGContextSetFillColorWithColor?使用Core foundation Objects时是否有任何性能优势?

1 个答案:

答案 0 :(得分:0)

要考虑的因素

易于使用

AppKit绘图API(包括NSRectFill)通常更容易,因为传递的内容较少。创建NSColors比使用CGColors(white and black之外)更容易方式

线程安全性

由于您没有使用AppKit API传递上下文(所有绘图都转到当前上下文),因此除了主线程之外,没有办法在任何线程上安全地进行AppKit绘图。

您也不应该使用AppKit创建的上下文进行CG绘图。如果你想绘制另一个线程,创建你自己的上下文,然后从中捕获一个图像,然后使用dispatch或主线程执行将其抛回主线程。

性能优势

假设为零。

绘画的昂贵部分是绘画。阴影最大,其次是栅格化路径(尤其包括文本)。栅格的合成(例如,CGImages和NSBIR)比你想象的要快。

通过比较,从NS *绘图API切换到CG *是 microscopic 。根据您在仪器中的发现,将您的优化时间花在其他地方。

关于可能值得这样做的唯一地方(不出所料)文本:Core Text可以比AppKit文本绘图更快但可测量的量更小。任何一个的最佳情况是一个不变的字符串,你可以保持和重用:在核心文本的情况下,你保持框架和/或框架;使用AppKit绘图,您只能保留属性字符串。如果你的字符串经常变化,那就什么都没有了:无论如何绘制它都会很昂贵。但是,再次首先配置文件并且在您已经证明它在您的应用中具有重要意义之前不要担心

可移植性

CG代码可以在Mac和iOS上使用,几乎不需要修改。 AppKit绘图代码仅适用于AppKit存在的地方:在Mac上。

判决

使用AppKit绘图,除非您想要移植到iOS(或维护现有的iOS版本),在这种情况下,请使用Core Graphics并尽可能多地重用绘图代码。

(当然,假设代码在两个平台上绘制相同的东西。如果它在每个平台上绘制不同,它应该只是两个单独的代码块,在这种情况下,每个代码都可以使用特定于平台的API,因为无论如何,每一个都是特定于平台的。)