核心图形缓存

Hen*_*mak 5 core-graphics ios

当使用图像将图像加载到应用程序中时[UIImage imageNamed: fileName],系统会缓存图像,因此在再次使用相同图像时可以提高性能.

使用Core Graphics创建的图像有类似的东西吗?我是指使用该UIImage *image = UIGraphicsGetImageFromCurrentImageContext();方法从上下文创建的图像.

我目前的方法是绘制图像并将UIImage保存到磁盘,以便下次我需要使用相同的绘图方法时,我只需从磁盘加载缓存的图像.我正在寻找一种更好的方法来存储Core Graphics生成的图像,因为当前的方法看起来很麻烦.

甚至可能将CGContextRef与所有绘图存储在一些缓存数据结构中,我不太确定这是否可能?

我的目标是仅使用Core Graphics,因此我的应用程序包更小,并且我获得了分辨率独立性,但我想提高性能,因为复杂的绘图例程可能需要花费大量时间来处理.

更新:在做了一些性能测试后,这里是我的结果.每次平均超过100次运行,一次绘制19或25个不同的视图.视图包括,矩形,圆圈,还有文本作为UILabels.使用填充,笔画,渐变和阴影.

缓存是在答案中讨论的,实现了存储UIImage对象的NSDictionary.每次运行都有一个单独的缓存,在运行中使用,但不是所有的视图(25个中有2组8,2组中的6个,它们是相同的,可以缓存).

以下是时代: iOS模拟器

19次观看

没有缓存 - 平均运行11.667ms

缓存 - 平均运行10.321ms

25次观看

没有缓存 - 平均运行14.304ms

缓存 - 平均运行13.509ms

设备

19次观看

没有缓存 - 平均82.785ms缓存 - 平均77.831ms

25次观看

没有缓存 - 平均107.977ms缓存 - 平均100.094ms

时间之间存在显着差异(几乎8%),当第一次考虑更长时间(保存到缓存)时,使用缓存仍然是有益的.

jrt*_*ton 1

我没有性能数据来支持这一点,但我认为使用 imageNamed 时的 UIImage 缓存是为了保存从“磁盘”读取文件并将 png 或其他内容转换为 UIImage 数据。

因此,写入磁盘的方法似乎是一个不必要的步骤 - 一旦您拥有 UIImage 对象,这将是您将获得的优化。

您可以考虑类似图像“工厂”单例的东西,它会根据请求延迟创建图像 - 因此第一次,它将执行必要的核心图形操作来创建 UIImage,然后返回完成的对象。每个不同的图像都将作为 ivar 存储在您的工厂中。