clipToBounds和masksToBounds性能问题

Llo*_*d18 9 performance cocoa-touch objective-c uiview ios

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

问题是我发现剪辑属性在滚动时会对性能产生很大影响:

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

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

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

Mik*_*ler 30

当你有图形密集型口罩和事情,一个简单易用的方式来提高性能(很多时候大大)是设置shouldRasterizeYES该项目的层上:

#import <QuartzCore/QuartzCore.h>

// ...

view.layer.shouldRasterize = YES;
Run Code Online (Sandbox Code Playgroud)

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

为了在视网膜显示器上正确行为,您还需要为以下项设置适当的值rasterizationScale:

view.layer.rasterizationScale = view.window.screen.scale; // or [UIScreen mainScreen]
Run Code Online (Sandbox Code Playgroud)

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