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

很显然,我应该注意什么性能的政治事物呢?

我想要一个尽可能多的例子列表。 或者是最佳实践的列表。

离屏渲染/在CPU上渲染

graphics性能的最大瓶颈是屏幕外渲染和混合 – 它们可能发生在animation的每一帧,并可能导致不连贯的滚动。

离屏渲染(软件渲染)发生在需要在软件(屏幕外)进行绘图之前,可以将其交给GPU。 硬件不处理文本呈现和高级构图与面具和阴影。

以下将触发离屏渲染:

  • 任何带有掩码的图层( layer.mask

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

  • layer.allowsGroupOpacity设置为YES且layer.opacity小于1.0的任何图层
    什么时候视图(或图层)需要离屏渲染?

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

  • layer.shouldRasterize为true的任何图层

  • 任何图层与layer.cornerRadiuslayer.edgeAntialiasingMasklayer.allowsEdgeAntialiasing

  • 任何与layer.borderWithlayer.borderColor
    缺less参考/certificate

  • 文本(任何types,包括UILabelCATextLayerCore Text等)。

  • drawRect:大部分绘图都使用CGContext 。 即使是一个空的实现将被渲染离屏。


混纺

  • resizableImage可能导致混合。
    在iOS上使用resizableImages时避免混合图层

  • 任何opaque图层,并具有alpha小于1.0的backgroundColor

  • 任何alpha小于1.0的图层

  • 任何与layer.content或任何UIImageView与具有alpha通道的UIImage


布局

以下事情将触发layoutSubviews在UIView上被调用:

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

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

  • layer.transform上更改transformlayer.transform触发器

注意:我指的是真正改变的地方

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

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


提高性能的一般技巧

  • 通常情况下, blendrender offscreen更好。

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

  • 在背景队列上绘制到UIImageCGImageRef

  • 绘制到一个CGLayer (与UIImage相比,在GPU上caching更好),并绘制任何你想要的。
    更新,请勿: http : //iosptl.com/posts/cglayer-no-longer-recommended/

  • 平展你的层次结构

  • 重复使用视图 – 滚动时不要创build和添加新的视图

  • 具有坚实的背景颜色opaque意见

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

  • 启用layer.shouldRasterize (小心使用)。 我个人喜欢避免这种情况,但是在某些情况下它的执行速度更快,因为图层的栅格将被caching和重用。 请记住,如果您在图层上启用了shouldRasterize ,那么频繁更改其内容或子图层内容将会导致性能下降,因为iOS会在每次更改时继续栅格化图层。


链接