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

hfo*_*sli 15 iphone cocoa core-animation ios

我应该注意什么样的表现?

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

hfo*_*sli 45

屏幕外渲染/在CPU上渲染

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

屏幕渲染(软件渲染)发生在需要在软件(屏幕外)进行绘图之前,可以将其移交给GPU.硬件不处理带有蒙版和阴影的文本渲染和高级合成.

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

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

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

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

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

  • 任何一层layer.shouldRasterize都是真的

  • 任何一层layer.cornerRadius,有layer.edgeAntialiasingMask,layer.allowsEdgeAntialiasing

  • 任何层与layer.borderWithlayer.borderColor
    缺少参考/证明

  • 文本(任何一种,包括UILabel,CATextLayer,Core Text等).

  • 大多数你做拉伸的CGContextdrawRect:.即使是空的实现也会在屏幕外呈现.


混纺

  • resizableImage可以导致混合.
    在iOS上使用resizableImages时避免混合层

  • 任何不opaque具有backgroundColoralpha小于1.0的层

  • 任何alpha小于1.0的图层

  • 与任何层layer.content或任何UIImageView一个UIImage具有alpha通道


布局

layoutSubviewsUIView将调用以下内容:

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

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

  • 在superview上更改transformlayer.transform触发

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

矛盾的这些变化不会引发layoutSubviews被称为:center,layer.position,layer.zPosition,layer.anchorPoint,layer.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将在每次更改时继续栅格化图层.


链接