UIImageView vs UIView w / Image - 效率

时间:2012-01-11 22:59:12

标签: iphone objective-c cocoa-touch uiview uikit

这不是一个关于解决特定问题的问题,而是更多要求指向正确方向的问题。

我正在创建一个应用程序,我同时将多张图片(保存为JPG)加载到屏幕上,这必须是它的方式,我无法卸载它们中的任何一个,因为它们都是立即出现。

我尝试以大约800px * 600px的分辨率天真地加载30张图像,认为它只会加载“压缩”的图片。图片大小进入内存(这约为200 KB) - 总共6 MB?当然,后来有几次记忆警告,我意识到我是多么愚蠢。所以我现在将它们的大小调整为大约400px * 300px,而我的iPhone 4S只是为了应对内存需求。

我最初使用的是UiView,在drawRect中我绘制了一个自定义绘制的图像,但转换到使用UIImageView可以大大改善这种情况。该应用程序更快,响应更快。 我还发现在我的图层中关闭光栅化会对性能产生巨大影响。

这些发现'花了我几个小时才研究出来,我想知道的是,是否有特定的设计模式或资源可以用来尽可能有效地将我的图像加载到屏幕上;主要是关于使用尽可能少的内存 - 是否有良好的经验法则?为什么使用UIImageView和UiView w / image会产生这样的差异呢?

如果有人可以提供帮助,我将非常感激。

感谢。

2 个答案:

答案 0 :(得分:9)

实现-drawRect:会导致系统分配与视图大小相同的位图图像(毕竟,您需要一个缓冲区来绘制)。如果你所做的只是绘制一个你已经加载的图像,那么你一下子就将该图像的内存使用量增加了一倍(因为你有你加载的副本,你刚刚绘制的第二个副本)。 / p>

类似地,栅格化图层需要分配与图层大小相同的位图图像,因此它具有栅格化的缓冲区。所以转过来也会吸收内存(与图层的大小成比例)。

基本的经验法则是,不要做额外的工作。使用-drawRect:绘制图像是额外的工作。栅格化图层是额外的工作(但是,取决于图层是什么,这可能是一次性成本(和恒定的内存成本),以便以后节省性能,例如,如果它是CAShapeLayer或如果它正在绘制阴影)。将大图像保存在内存中,在渲染到屏幕之前总是按比例缩小是额外的工作(只需在加载图像时将其缩小一次,并保持缩放的副本)。

要记住的另一件事是,如果你的目标是绘制图像,你应该尝试使用UIImageView。它通常是将图像输入屏幕的最快和最便宜的方式,而且它相当灵活。

答案 1 :(得分:8)

设计模式基本上是使用UIImageView。 Apple花了很多时间快速完成它,并允许Apple使用你不是的私有API。

也就是说,如果你想自己动手,你应该尝试每个图像使用一个CALayer。您只需加载图片并将其设置为content的{​​{1}}属性即可。 CALayer可以将其内容缓存在GPU内存中,并且可以执行其他无法使用公共API执行的优化。

通过观看Apple的开发视频,您可以了解很多关于快速创建用户界面的知识。它们包含许多提示和“内部信息”,这些提示和内部信息不在书面文档中,或者在文档中很难找到/容易忽略。开发视频在这里:http://developer.apple.com/videos/。一些与你的问题相关的好的:

  • iOS - “了解iOS View Compositing”
  • WWDC 2011 - “了解UIKit渲染”
  • WWDC 2011 - “适用于iOS开发人员的实用绘图”
  • WWDC 2011 - “Core Animation Essentials”
  • WWDC 2010 - “核心动画实践”