是什么触发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.cornerRadius
,layer.edgeAntialiasingMask
,layer.allowsEdgeAntialiasing
-
任何与
layer.borderWith
和layer.borderColor
?
缺less参考/certificate -
文本(任何types,包括
UILabel
,CATextLayer
,Core 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
上更改transform
或layer.transform
触发器
注意:我指的是真正改变的地方
layer.position
,这些更改不会触发layoutSubviews
被调用: center
, layer.position
, layer.zPosition
, layer.anchorPoint
, layer.anchorPointZ
。
参考: https : //github.com/hfossli/LayoutSubviewsInconsistency
提高性能的一般技巧
-
通常情况下,
blend
比render offscreen
更好。 -
考虑使用
drawRect:
而不是具有多个标签和子视图的视图。 -
在背景队列上绘制到
UIImage
或CGImageRef
。 -
绘制到一个
CGLayer
(与UIImage
相比,在GPU
上caching更好),并绘制任何你想要的。
更新,请勿: http : //iosptl.com/posts/cglayer-no-longer-recommended/ -
平展你的层次结构
-
重复使用视图 – 滚动时不要创build和添加新的视图
-
具有坚实的背景颜色
opaque
意见 -
避免将
alpha
和layer.opacity
设置为小于1.0 -
启用
layer.shouldRasterize
(小心使用)。 我个人喜欢避免这种情况,但是在某些情况下它的执行速度更快,因为图层的栅格将被caching和重用。 请记住,如果您在图层上启用了shouldRasterize
,那么频繁更改其内容或子图层内容将会导致性能下降,因为iOS会在每次更改时继续栅格化图层。
链接
- iOS核心animation:CALayer bringSublayerToFront?
- 在更改transitionWithView内的rootViewController时泄漏视图
- 使用animateKeyframesWithDuration在屏幕上创build一个连续旋转的正方形
- CAShapeLayer上的CABasicAnimation不能用于path更改
- UIImageViewcaching图像?
- 核心animation中的圆形箭头蒙版的长度的animation
- CAT交易没有观察到CALayer子类的属性
- iPhone – 沿着触摸和拖动path移动对象
- 有没有办法在UIViewPropertyAnimator中观察对fractionComplete的更改