clipToBounds和masksToBounds性能问题

时间:2012-06-15 10:32:31

标签: objective-c ios performance cocoa-touch uiview

我有UIScrollView和其中包含UIImageViews的对象数(UIView组合)。一些UIImageViews有圆形边框(我使用myImageView.layer.masksToBounds = YES;)。其他有矩形边框和图像的一部分(我在Interface Builder中使用Clip subviews属性)。

问题是我发现剪辑属性会在滚动时强烈影响性能:

对于iPod touch(第4代)分析结果:

  • 启用剪辑属性(两者或其中之一)滚动时我有大约30 fps
  • 具有禁用的剪辑属性我在滚动时拥有所有60 fps

我真的需要将一些图像剪切为圆形边界,将其他图像剪切为矩形边界(以显示图像的一部分)。所以,这是我的问题:有什么方法可以提高性能?可能有低水平的方法(drawRect:或其他东西),或者可能是围绕阿尔法掩蔽或我做错了会有用吗?

1 个答案:

答案 0 :(得分:30)

当你有图形密集的面具和东西时,一种简单而容易的方法来提高性能(通常是显着的)是在该项目的图层上设置shouldRasterizeYES

#import <QuartzCore/QuartzCore.h>

// ...

view.layer.shouldRasterize = YES;

这会将视图光栅化为缓冲区,因此不会不断重新渲染。这将占用每个视图的额外内存,因此您应该在滚动时尝试回收/重用视图,类似于表视图的方式。

为了在视网膜显示器上正确行为,您还需要为rasterizationScale

设置适当的值
view.layer.rasterizationScale = view.window.screen.scale; // or [UIScreen mainScreen]

我已经取得了很大的成功,例如滚动照片画廊,每个项目都有圆角,阴影等。