是什么触发iOS中的屏幕外渲染,混合和layoutSubviews?

时间:2012-10-31 13:12:29

标签: iphone ios cocoa core-animation

我应该关注哪些性能关键的事情?

我想要一个包含尽可能多的示例的列表。或者最佳实践清单。

1 个答案:

答案 0 :(得分:43)

在CPU上进行屏幕外渲染/渲染

图形性能的最大瓶颈是屏幕外渲染和混合 - 它们可能会在动画的每一帧中发生,并且可能导致不连贯的滚动。

屏幕渲染(软件渲染)发生在必须在软件中进行绘图(屏幕外)之后才能切换到GPU。硬件不处理带有蒙版和阴影的文本渲染和高级合成。

以下内容将触发屏幕外渲染:

  • 任何带面具的图层(layer.mask

  • layer.masksToBounds / view.clipsToBounds为真的任何图层

  • layer.allowsGroupOpacity设置为YES且layer.opacity的任何图层都小于1.0 When does a view (or layer) require offscreen rendering?

  • 任何带阴影的图层(layer.shadow*) 有关如何修复的提示:https://markpospesel.wordpress.com/tag/performance/

  • layer.shouldRasterize为真的任何图层

  • 包含layer.cornerRadiuslayer.edgeAntialiasingMasklayer.allowsEdgeAntialiasing

  • 的任何图层
  • 包含layer.borderWithlayer.borderColor的任何图层? 缺少参考/证明

  • 文字(任何种类,包括UILabelCATextLayerCore Text等。

  • 您在CGContext中使用drawRect:执行的大多数绘图。即使是空的实现也会在屏幕外呈现。


混合


布局

以下内容将触发在UIView上调用layoutSubviews

  • 在同一视图和超级视图上更改bounds触发器

  • 在同一视图和超级视图上更改frame触发器

  • 在superview上更改transformlayer.transform次触发器

注意:我指的是值实际发生变化的实际变化

相反,这些更改不会触发layoutSubviews被调用:centerlayer.positionlayer.zPositionlayer.anchorPointlayer.anchorPointZ

参考:https://github.com/hfossli/LayoutSubviewsInconsistency


提高绩效的一般提示

  • blend通常比render offscreen更好。

  • 考虑使用drawRect:,而不是使用包含多个标签和子视图的视图。

  • 在后台队列上绘制UIImageCGImageRef

  • 绘制到CGLayer(与GPU相比,UIImage上的缓存效果更好),然后将任意内容绘制到其中。
    更新,请勿:http://iosptl.com/posts/cglayer-no-longer-recommended/

  • 展平您的层次结构

  • 重复使用视图 - 滚动时不要创建和添加新视图

  • 拥有纯色背景的opaque次观看

  • 避免将alphalayer.opacity设置为小于1.0

  • 启用layer.shouldRasterize(谨慎使用)。我个人喜欢避免这种情况,但在某些情况下它会表现得更快,因为该层的栅格将被缓存并重复使用。请记住,如果您在图层上启用shouldRasterize,则频繁更改其内容或子图层内容会导致性能下降,因为iOS会在每次更改时继续栅格化图层。


链接