我应该注意哪些对性能至关重要的事情?
我想要一个包含尽可能多示例的列表。或最佳实践列表。
图形性能的最大瓶颈是屏幕外渲染和混合——它们可能发生在动画的每一帧中,并可能导致不连贯的滚动。
屏幕外渲染(软件渲染)发生在必须在软件(屏幕外)中进行绘图之前,然后才能将其移交给 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.borderWith
和的层layer.borderColor
?
缺少参考/证明
文本(任何类型,包括UILabel
、CATextLayer
、Core Text
等)。
您CGContext
在drawRect:
. 即使是一个空的实现也会被渲染到屏幕外。
resizableImage
可能导致混合。
在 iOS 上使用 resizableImages 时避免混合图层
任何不存在且opaque
a小于 1.0的层backgroundColor
alpha
任何alpha
小于 1.0的层
layer.content
任何具有或任何UIImageView
具有UIImage
Alpha 通道的图层
以下内容将触发layoutSubviews
在 UIView 上调用:
在同一视图和超级视图上更改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:
而不是使用具有多个标签和子视图的视图。
在后台队列上绘制到 aUIImage
或CGImageRef
。
绘制到 a (与 相比,CGLayer
它的缓存更好),然后将您想要的任何内容绘制到其中。
更新,不要:http: //iosptl.com/posts/cglayer-no-longer-recommended/GPU
UIImage
扁平化你的层次结构
重用视图——不要在滚动时创建和添加新视图
具有opaque
纯色背景色的视图
避免设置alpha
和layer.opacity
小于 1.0
启用layer.shouldRasterize
(小心使用)。我个人喜欢避免这种情况,但它在某些情况下执行得更快,因为图层的栅格将被缓存和重用。请记住,如果您shouldRasterize
在图层上启用频繁更改其内容或子图层内容会导致性能下降,因为 iOS 会在每次更改时继续栅格化图层。