在绘制视图背景时,最佳实践是什么?使用NSColor和NSRectfill,还是使用CGColorRef和CGContextSetFillColorWithColor之类的核心基础对象?当您使用Core对象时,有什么性能上的好处吗?
发布于 2013-09-16 21:41:36
需要考虑的因素
易用性
AppKit绘图API(包括NSRectFill )通常更容易,因为传递的次数较少。创建NSColors也比CGColors (白与黑之外)容易得多。
螺纹安全
由于您不使用AppKit API传递上下文(所有绘图都转到当前上下文),所以除了主线程之外,没有办法安全地在任何线程上执行AppKit绘图。
您也不应该使用来自AppKit的上下文进行CG绘图。如果您想在另一个线程上绘图,创建您自己的上下文,然后从它捕获一个图像,然后使用调度或主线程执行将其抛回主线程。
业绩效益
假设为零。
绘画中最昂贵的部分是绘画。阴影是最大的,其次是光栅化路径(尤其包括文本)。光栅的合成(例如,CGImages和NSBIR)比您预期的要快。
比较而言,从NS*绘图API切换到CG*是微观的。把你的优化时间花在其他地方,就像你在“仪器”中发现的那样。
唯一值得这样修改的地方是(毫不奇怪)文本:核心文本可以比AppKit文本绘制速度小但可测量的数量更快。这两种情况下的最佳情况都是一个不变的字符串,您可以保留该字符串并进行重用:对于Core,您将保留framesetter和/或框架;使用AppKit绘图,您只能保留属性字符串。如果您的字符串经常更改,则没有什么可供选择的:无论哪种方式,绘制它都是非常昂贵的。但是,再说一遍,配置文件是第一位的,在你证明它在你的应用程序中很重要之前,不要担心这一点。
便携性
CG代码可以在Mac和iOS上使用,几乎不需要修改。AppKit绘图代码只在AppKit存在的地方工作:在Mac上。
裁决
使用AppKit绘图,除非您希望移植到iOS (或维护现有的iOS版本),在这种情况下,使用并尽可能多地重用绘图代码。
(当然,假设代码在两个平台上绘制相同的内容。如果对每个代码都有不同的引用,那么应该是两个单独的代码块,在这种情况下,每个代码都可以使用特定于平台的API,因为每个API都是特定于平台的。)
https://stackoverflow.com/questions/18824427
复制相似问题