【问题标题】:When is it worthwhile to cache UIImage resources?什么时候值得缓存 UIImage 资源?
【发布时间】:2011-07-15 20:35:20
【问题描述】:

我一直在使用图像文件进行大量 iPhone UI 工作,这些图像文件在单个视图或整个应用程序的多个视图中的多个位置使用。在某些情况下,我会绘制新图标,通常是通过合成 2 个小图像(每个小于 4 KB)。

我曾考虑过如何优化图片加载,但我不确定最佳做法是什么。我猜想保存使用 CG 功能创建或更改的任何图像是值得的。对于未更改的图像,从包中加载图像的开销是多少?

UIImage* image = [UIImage imageNamed:@"myImage.png"]

考虑到移动设备的内存限制,在考虑缓存图像时哪些因素最重要?图片的大小、可以缓存的图片总数,以及单个图片的加载次数。

【问题讨论】:

  • UIImage imageNamed: 实际上已经缓存了图像。
  • 完全正确,@Till。我不知道我是如何在文档中错过的。看来我在我们的代码库中已经在继续一个不好的做法。

标签: iphone objective-c performance uiimage


【解决方案1】:

在 WWDC (2011) 的最新性能会议中,Apple 不建议在大多数情况下缓存图像。他们建议您仅在经过性能分析后知道需要提前缓存图像的事实时才缓存图像,因为您没有时间从磁盘加载它们并对其进行解码。在大多数情况下,您可能负担得起。

他们特别指出,正如 @Till 所做的那样,+[UIImage imageNamed:] 会在进程的整个生命周期内缓存图像,因此他们建议使用非缓存加载方法,例如 +[UIImage imageWithContentsOfFile:]

原因是内存在 iOS 设备上是一种受限资源,因此如果您缓存图像,很可能会对系统造成内存压力,并且应用程序会被喷射。而且由于 iOS 5 jetsams 应用程序首先使用更多内存,如果您要缓存一堆 UIImage,那么您的应用程序更有可能被 jetsammed。

【讨论】:

  • 感谢您非常彻底的回答。鉴于我们的大多数图片都很小以及它们被重复使用的频率,我认为我们可以在大多数地方使用+[UIImage imageNamed:]
  • 这个答案太棒了,令人惊讶。只是那种你不希望在 SO 上得到任何支持的事情 :)。无论如何,我已经从这里 stackoverflow.com/a/14032531/8047 链接到它(只是对非缓存选项的一些类别爱)。
  • 等等,这只是时间/性能问题?我想如果我有一个 UIImage 缓存,我可以通过在内存中不保存 X 次来节省资源......不是吗?
  • @VictorEngel 很高兴知道...有人测试过吗?
  • 我确定有人有。来自 Apple 的文档:“在内存不足的情况下,可能会从 UIImage 对象中清除图像数据以释放系统上的内存。这种清除行为仅影响 UIImage 对象内部存储的图像数据,而不影响对象本身。当您尝试绘制其数据已被清除的图像时,图像对象会自动从其原始文件重新加载数据。然而,这个额外的加载步骤可能会导致小的性能损失。但我不确定这是否是同一个缓存。
猜你喜欢
  • 2011-03-26
  • 2011-03-23
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 2021-09-12
  • 2012-07-01
  • 2011-03-03
  • 1970-01-01
相关资源
最近更新 更多