clipToBounds和masksToBounds性能问题

9
我有一个UIScrollView和许多带有UIImageView的对象(UIView构成)。其中一些UIImageView具有圆形边框(我使用myImageView.layer.masksToBounds = YES;实现),而其他一些具有矩形边框和部分图像(我在Interface Builder中使用“Clip subviews”属性)。
问题是我发现剪切属性会在滚动时严重影响性能:
对于iPod touch(第四代)的性能分析结果: - 当启用剪辑属性(两者之一或全部)时,滚动时大约有30fps。 - 当禁用剪辑属性时,滚动时有全部60fps。
我真的需要将某些图像裁剪为圆形边界,并将其他图像裁剪为矩形边界(以显示图像的一部分)。那么,我的问题是:有什么方法可以提高性能吗?也许可以使用低级别的方法(例如drawRect:或其他方式),或者尝试调整透明度遮罩,又或者我做错了什么?
1个回答

30

当你有涉及图形密集的遮罩等情况时,一个简单易行的提高性能(通常效果显著)的方法是在该项图层上将 shouldRasterize 设置为 YES

#import <QuartzCore/QuartzCore.h>

// ...

view.layer.shouldRasterize = YES;

这将把视图栅格化为缓冲区,以避免它不断地重新渲染。这将为每个视图占用额外的内存空间,因此您应该尽量像表视图一样在滚动时进行回收/重用视图。

为在Retina显示屏上正确显示,您还需要设置适当的rasterizationScale值:

view.layer.rasterizationScale = view.window.screen.scale; // or [UIScreen mainScreen]

我在处理滚动照片库等带有圆角、阴影等效果的项目时,使用这种方法非常成功。


好建议!但是现在当我将这个属性应用到整个视图(包括圆形图片视图和内部文本标签)时,它真的很有帮助。在这种情况下,文本变得非常丑陋...如果我只将其应用于圆形图片视图上,几乎没有效果。 - Lloyd18
1
啊,抱歉。为了支持视网膜屏幕,请将 view.layer.rasterizationScale = [[UIScreen mainScreen] scale]设置。这样应该能让所有东西都清晰起来。我已经更新了我的答案。 - Mike Weller
1
记得检查您的内存使用情况。使用“Activity Monitor”工具查看光栅化时的内存使用情况。额外的视频内存可能不会显示在分配中。如果增加太大,您应该尝试像我说的那样回收视图,以便任何单个时间都没有太多实例。 - Mike Weller
非常感谢!这让我避免了麻烦,使我能够继续使用漂亮的圆角。 - Isaac Dontje Lindell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接