2012-06-15 45 views
9

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

的问题是,我发现,剪辑属性强烈地影响性能的同时,滚动:

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

  • 启用剪辑属性(两个或一个他们)我有大约30 fps的同时滚动
  • 残疾剪辑属性我都60帧,同时滚动

我真的需要剪切一些图像以将边界和其他边界限制到矩形边界(以显示图像的一部分)。所以,这是我的问题:有什么方法可以提高性能?可能是有低级别的方法来做到这一点(drawRect:或其他),或者可能会发挥阿尔法遮罩或我只是做错了什么?

回答

30

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

#import <QuartzCore/QuartzCore.h> 

// ... 

view.layer.shouldRasterize = YES; 

这将rastersize的查看缓冲区,所以它不会经常重新渲染。这将为每个视图占用额外的内存,因此您应该在滚动时真正尝试并回收/重用视图,这与表视图的操作方式类似。

视网膜显示屏你还需要设置rasterizationScale一个合适的值上正确的行为:

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

我已经受够了这种巨大的成功对于像滚动的照片画廊,每个项目都圆角,阴影等

+0

不错的建议!但是现在当我将这个属性应用于整个视图时(这里有圆形的图像视图和文本标签),它确实有帮助。在这种情况下,文字变得非常丑陋。如果我仅将它应用于圆形图像视图上,它几乎没有效果。 – Lloyd18

+1

啊,对不起。对于视网膜支持,设置'view.layer.rasterizationScale = [[UIScreen mainScreen] scale]'。这应该使一切都变得清晰。我已经更新了我的答案。 –

+0

并记住检查你的内存使用情况。使用“活动监视器”工具查看使用光栅化时的内存使用差异。额外的视频内存可能不会显示在分配中。如果增加太多,你应该像我说的那样尝试和回收视图,这样在任何时候都不会有太多的实例。 –