Objective c 视图绘制-核心基础与NSCORE

Objective c 视图绘制-核心基础与NSCORE,objective-c,cocoa,custom-view,Objective C,Cocoa,Custom View,在绘制背景视图时,应遵循的最佳实践是什么?使用NSCORE和NSRectfill,或者使用CGCyReReF和CGCutExtFieldCurror颜色的核心基础对象?当使用核心基础对象时,是否有任何性能上的好处?考虑因素 易用性 AppKit绘图API(包括NSRectFill)通常比较容易,因为传递的内容较少。创建NSColors比创建CGColors(外部)更容易 线程安全 由于您不使用AppKit API传递上下文(所有图形都进入当前上下文),因此除了主线程外,无法在任何线程上安全地进行

在绘制背景视图时,应遵循的最佳实践是什么?使用NSCORE和NSRectfill,或者使用CGCyReReF和CGCutExtFieldCurror颜色的核心基础对象?当使用核心基础对象时,是否有任何性能上的好处?

考虑因素 易用性 AppKit绘图API(包括
NSRectFill
)通常比较容易,因为传递的内容较少。创建NSColors比创建CGColors(外部)更容易

线程安全 由于您不使用AppKit API传递上下文(所有图形都进入当前上下文),因此除了主线程外,无法在任何线程上安全地进行AppKit绘图

您也不应该使用源自AppKit的上下文进行CG绘图。如果要在另一个线程上绘制,请创建自己的上下文,然后从中捕获图像,然后使用dispatch或main thread perform将其扔回主线程

绩效效益 假设为零

绘画中最昂贵的部分是绘画。阴影最大,其次是栅格化路径(尤其包括文本)。光栅(例如CGImages和NSBIR)的合成速度比您预期的要快

相比之下,从NS*绘图API切换到CG*是非常微小的。根据您在Instruments中的发现,将优化时间花在其他地方

这样的改变可能唯一值得的地方是(毫不奇怪)文本:核心文本可能比AppKit文本绘图的速度小但可以测量。任何一种情况下的最佳情况都是可以保留和重用的不变字符串:对于核心文本,可以保留框架设置器和/或框架;使用AppKit绘图,只能保留属性字符串。如果您的字符串经常更改,那么就没有什么好做的:无论哪种方式,绘制它都会很昂贵。但是,再次强调,首先要进行简介,在证明它在应用程序中的重要性之前,不要担心这一点

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

判决 使用AppKit绘图,除非您希望移植到iOS(或维护现有的iOS版本),在这种情况下,请使用核心图形并在两者上尽可能多地重用绘图代码

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