我应该关注哪些性能关键的事情?
我想要一个包含尽可能多的示例的列表。或者最佳实践清单。
答案 0 :(得分:43)
图形性能的最大瓶颈是屏幕外渲染和混合 - 它们可能会在动画的每一帧中发生,并且可能导致不连贯的滚动。
屏幕渲染(软件渲染)发生在必须在软件中进行绘图(屏幕外)之后才能切换到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.cornerRadius
,layer.edgeAntialiasingMask
,layer.allowsEdgeAntialiasing
包含layer.borderWith
和layer.borderColor
的任何图层?
缺少参考/证明
文字(任何种类,包括UILabel
,CATextLayer
,Core Text
等。
您在CGContext
中使用drawRect:
执行的大多数绘图。即使是空的实现也会在屏幕外呈现。
resizableImage
会导致混合
Avoiding blended layers when using resizableImages on iOS
任何非opaque
且backgroundColor
alpha
小于1.0的图层
alpha
小于1.0
包含layer.content
或任何UIImageView
且UIImage
具有Alpha通道的任何图层
以下内容将触发在UIView上调用layoutSubviews
:
在同一视图和超级视图上更改bounds
触发器
在同一视图和超级视图上更改frame
触发器
在superview上更改transform
或layer.transform
次触发器
注意:我指的是值实际发生变化的实际变化
相反,这些更改不会触发layoutSubviews
被调用:center
,layer.position
,layer.zPosition
,layer.anchorPoint
,layer.anchorPointZ
。
参考:https://github.com/hfossli/LayoutSubviewsInconsistency
blend
通常比render offscreen
更好。
考虑使用drawRect:
,而不是使用包含多个标签和子视图的视图。
在后台队列上绘制UIImage
或CGImageRef
。
绘制到CGLayer
(与GPU
相比,UIImage
上的缓存效果更好),然后将任意内容绘制到其中。
更新,请勿:http://iosptl.com/posts/cglayer-no-longer-recommended/
展平您的层次结构
重复使用视图 - 滚动时不要创建和添加新视图
拥有纯色背景的opaque
次观看
避免将alpha
和layer.opacity
设置为小于1.0
启用layer.shouldRasterize
(谨慎使用)。我个人喜欢避免这种情况,但在某些情况下它会表现得更快,因为该层的栅格将被缓存并重复使用。请记住,如果您在图层上启用shouldRasterize
,则频繁更改其内容或子图层内容会导致性能下降,因为iOS会在每次更改时继续栅格化图层。