【问题标题】:clipToBounds and masksToBounds performance issueclipToBounds 和 maskToBounds 性能问题
【发布时间】:2012-06-15 10:32:31
【问题描述】:

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

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

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

  • 启用剪辑属性(两者或其中之一)我在滚动时大约有 30 fps
  • 在禁用剪辑属性的情况下,滚动时我的速度全部为 60 fps

我真的需要将一些图像剪辑到圆形边界和其他矩形边界(以显示图像的一部分)。所以,这是我的问题:有什么方法可以提高性能?可能有一些低级的方法(drawRect: 或其他东西),或者玩 alfa masking 或者我做错了什么可能会有用?

【问题讨论】:

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


    【解决方案1】:

    当您有图形密集型蒙版和事物时,一种简单而简单的提高性能(通常是显着)的方法是在该项目的图层上将shouldRasterize 设置为YES

    #import <QuartzCore/QuartzCore.h>
    
    // ...
    
    view.layer.shouldRasterize = YES;
    

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

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

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

    我在滚动照片画廊等方面取得了巨大成功,其中每个项目都有圆角、阴影等。

    【讨论】:

    • 好建议!但现在,当我将此属性应用于整个视图(内部带有圆形图像视图和文本标签)时,它真的很有帮助。在这种情况下,文本变得如此丑陋。如果我只将它应用于圆形图像视图,它几乎没有效果。
    • 啊,对不起。对于视网膜支持,设置view.layer.rasterizationScale = [[UIScreen mainScreen] scale]。那应该让一切都变得清晰。我已经更新了我的答案。
    • 记得检查您的内存使用情况。使用“活动监视器”工具查看使用光栅化时的内存使用差异。额外的视频内存可能不会显示在分配中。如果增加太大,您应该尝试像我说的那样回收视图,以便在任何时候都不会有太多实例。
    • 非常感谢!这节省了我的培根,让我可以继续使用漂亮的圆角。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 2020-04-05
    • 2016-08-21
    • 2012-08-18
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多