2011-10-17 38 views
0

我目前有一个应用程序,我在这里做了很多图像处理。我基本上拍摄的图像是320x320(或640x640的视网膜),并将其缩小到128x128(或256x256的Retina),然后四舍五入,并应用光泽突出显示。一切都是使用Core Graphics绘图完成的。磁盘缓存vs重新创建图像

任何时候都可能有大约600张图片需要这个处理,所以我在应用程序启动时使用后台线程做了大约40次,并将它们缓存到FIFO队列中。当不在缓存中的图像需要处理时,我这样做并将其添加到缓存的末尾,放弃第一个缓存的图像。如果再次需要第一张图像,它会经历相同的过程。

我想知道的是,如果它更有意义,并且最终效率更高,将丢弃的图像保存到磁盘,而不是在下次需要时从头重新创建它们,因为我可以只读他们从磁盘。

这些图像也使用CALayer显示,因此当由于从UIImageCGImage的转换而设置图层的内容时可能会有开销。如果我将它们存储在磁盘上,我相信它们可以直接作为CGImage读取?

有关提高此过程效率的任何想法和意见将受到热烈欢迎。

+0

请注意,解压缩图像需要比从磁盘读取更长的时间http://www.cocoanetics.com/2011/10/avoiding-image-decompression-sickness/我想你将不得不计时每个部分(阅读,解压缩,缩放+圆整+光泽),看看会发生什么。 – Jano

+0

我会在保存之前将比例+圆形+光泽缩放,所以我唯一需要了解的是解压缩成本。图像可以不被压缩存储吗?比如只存储他们的数据,例如? –

回答

1

我个人的选择是使用磁盘缓存。

但是,你说'哪个更有效率' - 你是什么意思?

  • 如果你的意思是速度更快,那么磁盘缓存可能会赢。
  • 如果你的意思是更多的空间效率,那么重新创建它们就会获胜。
  • 如果您的意思是较低的内存使用率,那么它完全取决于您的实施!

你将不得不尝试一下,看看:)

但是,磁盘解决方案的好处是,你的应用程序启动第二次,它会已经做了处理,将启动速度更快。这就是为什么我会使用磁盘。

+0

通过高效,我的意思是更快。我在任何时候只能在内存中保存大约40张图像,所以内存使用不是真正的问题。这些图像可能随时更改,因为它们是用户iPod音乐库中的图稿,因此每次同步后都需要将其缓存到磁盘。你认为使用'CGImageCreateWithPNGDataProvider'这样的磁盘读取并且将图层内容设置为结果而不是使用'UIImage'和它的方便方法会更快吗? –

+0

我认为UIImage将会尽可能少的开销(它甚至可能在幕后使用CALayer的东西!)我个人认为UIImage的便利(除非它开始成为一个问题,那么你应该做一些基准测试以查看哪个更快,以及更复杂的代码是否值得)。音乐库中的艺术作品实际上有多频繁变化?我敢打赌,这不是那么经常 - 如果它是你以后的速度,那么一定要使用磁盘。 – deanWombourne

+0

它不是专门改变的艺术品。每个'MPMediaItem'都有一个只在iPod库同步之间持续存在的标识(*其中存在更改,例如添加或删除专辑*)。将磁盘上的缓存封面与专辑相关联的唯一方法是使用该ID,以便每次同步时,您需要重新缓存整个库的项目ID更改。 –

0

根据我的经验,保存然后从磁盘读取速度更快。我反复做了一些记忆警告,而不是保存和阅读。但是,唯一知道的就是尝试。我使用了大约1000张图像,因此在我的情况下使用磁盘的感官。

+0

在开发过程中,我只需要处理大约600张图片的最大数量,但是一旦应用程序发布,这个数字很可能会增加。我只能在内存中存储大约40张图像,其中iPhone 4需要约10-12mb,3GS需要约2.5mb。 –

+0

尽量保持举例,即使它在你的语境中没有意义,总是试图推动事物(墨菲法则:P)。因此,如果您目前需要最多600个,请尝试保留800个,以查看您的应用的行为。检查日志中的内存警告。 – Peres

+0

在视网膜上,图像平均为250k(256x256x4),因此在内存中保存600将需要约150mb,这在iPhone上是不可能的。这就是为什么我将它保持在10mb左右或更低。 –