【问题标题】:UIView clipsToBounds property: Does it improve performance?UIView clipsToBounds 属性:它会提高性能吗?
【发布时间】:2010-10-23 16:24:55
【问题描述】:

文档说UIViewclipsToBounds 属性会将绘图裁剪到边界,或者更准确地说,subView 不能在superView 的边界之外绘制。

听起来不错,但在实践中这意味着什么?

如果我将其设置为 YES,那么我的subView 将自动仅绘制那些不在superView 范围之外的部分。所以它提高了整体性能还是我仍然必须确保我没有创建任何不可见的视图,即在 UIScrollView 内?

【问题讨论】:

    标签: iphone uikit uiview


    【解决方案1】:

    我认为恰恰相反:打开剪辑会损害性能,因为它必须设置剪辑蒙版。我依稀记得在某处读过这篇文章,但现在找不到了。

    【讨论】:

    • 我认为你是对的。简而言之,操作系统必须做一些事情来实现剪辑,因此会损害性能。
    • 但是剪裁本身并不是这样的事情,系统不会告诉任何想要在边界之外绘制的方法:“嘿,伙计,不要这样做。节省你的时间,喝杯茶。不用在这里画画!”?
    • 其实是这样。在幕后,操作系统正在做类似 OpenGL 的事情,它必须决定画什么而不画什么。决定需要 CPU 周期。
    • 如果 iOS 在 OpenGL 中执行此操作,那么它会占用 GPU 周期,而不是 CPU 周期,这是一个非常大的区别。如果它实际上是由 GPU 驱动的,那么剪辑本身的性能影响可能可以忽略不计。
    • 它肯定会减慢速度,至少在 UITableViewCell 中是这样。我在表格视图中的每个单元格视图的内容视图中添加了 5 个以编程方式创建的 UIButton 对象。为了让我的按钮得到圆角,我添加了标准的 2 行 (self.layer.cornerRadius = numPixes;self.clipsToBounds = YES;) 但滚动突然变慢了很多。我注释掉了 clipsToBounds 分配,一切恢复正常。
    【解决方案2】:

    只有在您了解视图层次结构的情况下,(可能的)性能影响才是确定性的。如上所述,通常渲染器将使用 GPU 周期来绘制视图,除非层次结构中的某些视图使用 drawRect:。这不会影响 OpenGL ES 应用程序,因为drawRect:在此类应用程序中被省略。

    据我了解,与实际计算/绘制/混合整个视图相比,确定和显示剪切区域所需的周期可能更少。截至OpenGL ES 2.0,裁剪可以在GPU中计算。

    【讨论】:

      【解决方案3】:

      clipsToBounds 的用例更多用于部分位于主视图之外的子视图。例如,我在其父(矩形)UIView 的边缘有一个(圆形)子视图。如果将 clipsToBounds 设置为 YES,则只会显示一半的圆/子视图。如果设置为 NO,将显示整个圆圈。刚好遇到这个,想分享一下。

      【讨论】:

        猜你喜欢
        • 2013-04-12
        • 1970-01-01
        • 2011-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-13
        • 2019-11-11
        相关资源
        最近更新 更多