iPhone:快速阅读许多图像

时间:2010-08-22 03:27:22

标签: iphone image file

我有一个应用程序,我正在处理滚动视图中一次处理大量图像的地方。 (以下是它的外观,每个蓝色块在滚动视图中的图像中向右扩展:http://i.stack.imgur.com/o7lFx.png)因此,为了能够处理大量的压力,这样就会占用内存。所以我已经实现了一系列技术,例如重用图像视图等,这些技术在保持内存使用率方面都非常成功。我做的另一件事是不是将实际图像保存在内存中(我当然不能对所有这些图像做,因为这会很快耗尽内存)我只将图像的文件路径保存在内存中然后读取图像时用户滚动到该图像附近的滚动视图的区域。但是,尽管这是内存效率高的,但由于它必须不断地从磁盘读取图像,所以它在滚动视图中造成了很多延迟。我想不出如何解决这个问题的好方法。基本上现在应用程序仅向屏幕绘制可见的uiimageviews,当用户滚动应用程序时,将查看是否可以将另一个图像视图出列,因此它不必分配另一个图像视图,此时它将图像读入内存,但正如我所说,它导致滚动动作非常缓慢。关于用于解决此问题的策略的任何想法?有谁知道本机照片应用程序处理这种事情的方式是什么?非常感谢!

3 个答案:

答案 0 :(得分:1)

我可以建议一个简单的解决方案来平衡内存和计算机处理。您只在内存中保留缩略图等小图像,并且只保留其中的大约20个。我正在做的一个项目,我保留最近访问的20个缩略图(100 x 100),这不会花费大量内存。我相信它总是花费大约200 kb,但与一般可用内存相比。我觉得这很好。

这还取决于你的用例:如果用户滚动得非常快,你不知道他们什么时候会去。您可以拥有比thumnail更小的图像,当您在UIImageView上显示它时,您可以调整它以适应。当用户停止滚动一段时间。您可以开始加载更大的图像,然后您就可以获得更好的图像。用户可能甚至没有注意到该过程

我认为没有一种解决方案可以快速使用尽可能少的内存。因为我们有记忆,也许不大但如果我们巧妙地使用它就足够了。

答案 1 :(得分:1)

慢滚动性能可能意味着您在加载图像时阻塞了主线程。在这种情况下,滚动动画将不会继续,直到加载图像,这确实会导致相当不稳定的滚动性能。

最好在后台懒洋洋地加载请求的图像,而主线程继续处理滚动动画。提供此功能(以及其他功能)的库是'three20'库。请参阅Tidbits文档,然后向下滚动到描述'TTImageView'类的底部。

答案 2 :(得分:0)

我在使用PDF查看器时遇到了类似的问题,建议的方法是让图像的图像尽可能低,如果你允许用户将图像向上/缩放,那么该图像的两个版本或三个版本随着时间的推移增加了res。

在didDecelerate方法中放置尽可能多的代码(比如加载更高分辨率的图像,如vodkhang谈论),而不是在didScroll中处理负载。正如您所说,回收视图超出范围。并注意自动释放​​的基于上下文的图像创建功能。

智能地将图像加载到背景线程中(基于scrollView偏移位置和缩放级别),并考虑使用CALayer / Tiled Layer绘制更大的图像。

Three20(一个开源的iOs lib)有一个很好的Photo Viewer,它可以被子类化,它具有缩略图导航,大图像分页,缓存和手势开箱即用。