CATiledLayer和UIImageView它们之间有什么关系?

时间:2012-01-15 10:57:44

标签: ios performance memory uiimageview catiledlayer


几个月前,我发现了一个来自Apple网站的非常棒的示例代码。这个样本被称为“LargeImageDownsizing”,很棒的是它解释了很多关于如何从资源中读取图像然后在屏幕上呈现的内容。
深入研究代码我发现了一些让我感到不安的东西。缩小尺寸的图像被传递到具有CATiledLayer的视图,但是没有在每个图块上给出一块图像以提高内存性能,它只是设置图块大小然后加载图像(我简化了概念)因此,我的问题基本上就是为什么?为什么使用CATiledLayer如果它没有以正确的方式提供,他们可以使用正常的UIImageView ...
所以我做了一些测试来理解我是否是正确的。修改代码简单地添加带有图像视图的scrollview作为子视图并响应委托scrollview进行缩放。我在设备和sim上测试了这些结论:

  1. - 内存影响和足迹完全相同,即使在缩放滚动操作期间也没有让我感到惊讶,图像在内存中解压缩了
  2. - 时间配置文件说tileview在滚动缩放操作期间需要花费更多时间而不是uiimageview,这一点也不会让我感到惊讶uiimageview已经被绘制了
  3. - 如果我发送内存警告,两个解决方案之间没有任何变化(仅限于SIM卡)
  4. - 测试核心动画性能我在60FPS左右得到相同的结果
  5. 那么这两个视图/层之间的交易是什么?在这些特定情况下,为什么我应该选择一个而不是另一个? UIImageView似乎赢得了这场战斗。

    我希望有人可以帮助我理解这一点。

1 个答案:

答案 0 :(得分:0)

对于小图像,它们可能会执行相同的操作,因为在性能方面唯一的区别是CATiledLayer在后台线程上绘制。根据瓷砖尺寸,CATiledLayer甚至会变慢,因为它必须为一个图像绘制多个瓷砖。

但是......

CATiledLayer的一点是,您不需要绘制所有图块,尤其是在放大非常大的图像时。知道实际需要哪些部件是明智的。它也很聪明地驱逐不再需要的瓷砖。

或者这个工作机制你需要分别提供图像的各个部分。我们说的是一张图像的总大小,可能无法在未压缩的内存中保存。