核心图形缓存

5
使用[UIImage imageNamed: fileName]向应用程序加载图像时,系统会缓存图像,因此当再次使用相同的图像时会提高性能。
对于使用Core Graphics创建的图像是否有类似的方法呢?我指的是使用UIImage *image = UIGraphicsGetImageFromCurrentImageContext();方法从上下文中创建的图像。
我目前的做法是绘制图像并将UIImage保存到磁盘中,以便下一次需要使用相同的绘制方法时,只需从磁盘加载缓存的图像。我正在寻找一种更好的方法来存储Core Graphics生成的图像,因为当前的方法似乎很麻烦。
也许甚至可以将带有所有绘图信息的CGContextRef存储在某些缓存数据结构中,但我不确定是否可能?
我的目标是仅使用Core Graphics,这样我的应用程序包会更小,并且我可以获得分辨率独立性,但我想改进性能,因为复杂的绘图例程可能需要很长时间来处理。
更新:进行了一些性能测试后,以下是我的结果。每次运行都是100次的平均值,每次绘制19或25个不同的视图。视图包括矩形、圆形,但也包括文本作为UILabels。填充、描边、渐变和阴影都被使用了。
如讨论中所述,实现了缓存,使用NSDictionary存储UIImage对象。每个运行都有一个单独的缓存,用于该运行,但不用于所有视图(在25个视图中,有2组8个和2组6个在19个视图中是相同的,可以被缓存)。
以下是时间:
iOS模拟器
19个视图
没有缓存-平均运行11.667毫秒
缓存-平均运行10.321毫秒
25个视图
没有缓存-平均运行14.304毫秒
缓存-平均运行13.509毫秒
设备
19个视图
没有缓存-平均82.785毫秒
缓存-平均77.831毫秒
25个视图
没有缓存-平均107.977毫秒
缓存-平均100.094毫秒
时差很明显(将近8%),考虑到较长的第一次(保存到缓存),仍然有利于使用缓存。

你是指在单个会话中存储还是在应用程序启动之间存储?顺便说一句,这次问题好多了 :) - jrturton
两者都很有趣,但我想单个会话解决方案更有意义(我试图尽可能少地使用实际存储空间,因此将图像作为资产摆脱)。 - Henri Normak
1个回答

1

我没有性能数据来支持这一点,但我认为在使用imageNamed时UIImage缓存是为了避免从"磁盘"读取文件并将png或其他格式转换为UIImage数据。

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

您可以考虑像图片“工厂”单例这样的东西,它会懒惰地创建请求的图像 - 所以第一次,它需要进行必要的核心图形操作来创建UIImage,之后返回完成的对象。每个不同的图像只需存储在工厂的ivar中。


好的,但是如果我的绘图方法更加动态,可以改变绘图的某些方面,我该如何区分不同版本的图像?我在考虑使用一个NSDictionary,其中键为代表图像配置的NSDictionaries,而值则是UIImage对象,这样做有意义吗? - Henri Normak
基本上,我有一组用于绘制基元的绘图方法,例如矩形或椭圆,这些方法接受变量以更改元素的颜色、描边、阴影等。目前没有真正的性能“问题”,但我希望在像表视图这样需要快速创建20多个相同元素的情况下使用这些图形...无论如何,我希望有人能提供关于UIImage缓存的性能数据。 - Henri Normak
我会进行一些性能测试,并稍后接受这个答案,除非有更好的回复发布出来 :) - Henri Normak
完全明白!记住,tableView 中也有缓存。我完全支持您采用代码绘制的方法(主要是因为我无法画图!) - jrturton
如果每个单元格中的图像都不同,则不使用缓存。 - jrturton
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接