【问题标题】:UIImageView vs UIView w/ Image - efficiencyUIImageView vs UIView w/ Image - 效率
【发布时间】:2012-02-08 07:45:57
【问题描述】:

这实际上并不是一个关于解决特定问题的问题,而是一个指向正确方向的请求。

我正在制作一个应用程序,我在其中将多个图像(保存为 JPG)同时加载到屏幕上,并且必须是这样,我无法卸载任何一个,因为它们都在显示一次。

我尝试以大约 800px*600px 的分辨率加载 30 张图片,天真地认为它只会将图片的“压缩”大小加载到内存中(大约 200 KB) - 所以总共 6 MB?当然,在几次内存警告之后,我意识到自己是多么愚蠢。所以我现在将它们重新调整为大约 400 像素 * 300 像素,而我的 iPhone 4S 刚好可以满足内存需求。

我最初使用 UiView,在 drawRect 中我绘制了一个自定义绘制的图像,但改用 UIImageView 极大地改善了这种情况。该应用程序的速度和响应速度要快得多。 我还发现在我的图层中关闭光栅化会对性能产生巨大影响。

这些“发现”花了我几个小时来解决,我想知道是否有特定的设计模式或资源可以用来尽可能高效地将我的图像加载到屏幕上;主要是关于使用尽可能少的内存 - 有没有好的经验法则?为什么使用 UIImageView 与带有图像的 UiView 会产生如此大的差异?

如果有人能提供帮助将不胜感激。

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    同样,栅格化图层需要分配与图层相同大小的位图图像,因此它有一个要栅格化的缓冲区。所以打开它也会消耗内存(与层的大小成正比)。

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

    要记住的另一件事是,如果您的目标是绘制图像,则应尽可能使用UIImageView。这通常是将图像显示在屏幕上的最快和最便宜的方式,而且相当灵活。

    【讨论】:

      【解决方案2】:

      设计模式基本上是,使用UIImageView。 Apple 花了很多时间来加快速度,Apple 可以使用您不可以使用的私有 API。

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

      通过观看 Apple 的开发视频,您可以学到很多关于如何加快 UI 的知识。它们包括许多提示和“内部信息”,这些提示和“内部信息”要么不在书面文档中,要么在文档中难以找到/容易忽略。开发视频在这里:http://developer.apple.com/videos/。一些与您的问题相关的好问题:

      • iOS - “了解 iOS 视图合成”
      • WWDC 2011 - “了解 UIKit 渲染”
      • WWDC 2011 - “iOS 开发者实用绘图”
      • WWDC 2011 - “核心动画要点”
      • WWDC 2010 - “核心动画实践”

      【讨论】:

      • 感谢您的链接 - 它们非常有用。
      • +1 推荐一些来自 Apple 的视频(尤其是因为 Apple 搜索和观看这些视频的界面很糟糕!)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      相关资源
      最近更新 更多