我正在开发一个图像应用程序,用户可以在其中拍照然后“擦洗”它们。洗涤器是一个 UISlider,当用户从左向右移动拇指时,全屏存储图像显示。可能有数百张图像,我希望擦洗体验没有滞后。
到目前为止,这就是我所做的。如果您知道其中任何一个都不是最有效的,请告诉。
1)我将每张照片的低分辨率(大约 40% 质量)JPEG 版本存储在单独的数据库表 PhotoLowQuality 中。我听说我最好将它们存储为文件并将 filePath 放入数据库中?我已经在一个代码分支中使用高分辨率图像执行此操作,尚未测试性能差异。
2) 我现在将全分辨率照片存储为 85% 的 JPEG,调整到大约 1.5 兆像素 (1500x1000) 的大小(因为 iPhone 屏幕甚至不是 1 MP)。我留了一点空间让他们放大,但我们不需要太多这种类型的应用程序。
3)当用户浏览照片时,速度很快(例如,最后一张照片显示在不到 0.1 秒前),我先提供低质量版本,然后启动一个定时器,拉取高质量版本的照片说 0.1 秒后。当用户继续滚动时,他们会看到低版本的图片(不过你几乎看不出区别),一旦他们放慢速度或停下来,他们就会几乎立即看到全分辨率的图片。
4)我用 NSCache 缓存照片,但我真的宁愿立即拥有 30+ FPS,而不是在第一次通过之后。另外,我注意到 NSCache 有时会因为在低内存条件下释放内存不够快而导致应用程序崩溃,尽管文档说它确实如此。
要阅读照片,我只需使用:
[UIImage imageWithContentsOfFile:photoCoreDataEntity.filename];
这在 iPhone 5 上运行得非常顺利。在 iPhone 4 上没有那么多。我还没有任何多线程 - 仍在尝试找出适合它的最佳方法。例如,如果我将每个图像读取请求都放在 NSOperation ,当用户滑动到下一张照片时,我可以取消之前的操作,但是它真的会在读取这张照片的过程中取消还是等到它完成阅读,从而使整个想法变得毫无意义?也许我需要自己读取字节作为蒸汽并定期检查取消标志......
任何解决此问题的帮助将不胜感激!谢谢你