我应该注意哪些对性能至关重要的事情?
我想要一个包含尽可能多示例的列表。或最佳实践列表。
最佳答案
离屏渲染/在 CPU 上渲染
图形性能的最大瓶颈是屏幕外渲染和混合——它们可能发生在动画的每一帧中,并可能导致不连贯的滚动。
屏幕外渲染(软件渲染)发生在必须在软件(屏幕外)中进行绘图之前,然后才能将其移交给 GPU。硬件不处理带有蒙版和阴影的文本渲染和高级合成。
以下将触发离屏渲染:
layer.mask
)layer.masksToBounds
的层/view.clipsToBounds
真实layer.allowsGroupOpacity
的层设置为 YES 和 layer.opacity
小于 1.0When 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.0alpha
的层小于 1.0layer.content
的层或任何 UIImageView
与 UIImage
有一个阿尔法 channel 布局
以下情况会触发
layoutSubviews
在 UIView 上调用:bounds
在同一 View 和 super View 上触发frame
在同一 View 和 super View 上触发transform
或 layer.transform
在superview上触发注意:我指的是值实际发生变化的实际变化
矛盾的这些更改不会触发
layoutSubviews
被称为:center
, layer.position
, layer.zPosition
, layer.anchorPoint
, layer.anchorPointZ
.引用:https://github.com/hfossli/LayoutSubviewsInconsistency
提高性能的一般提示
blend
更好。比 render offscreen
.drawRect:
而不是具有多个标签和 subview 的 View 。UIImage
或 CGImageRef
.CGLayer
(与 GPU
相比,它在 UIImage
上的缓存更好),并在其中绘制您想要的任何内容。更新,不要:http://iosptl.com/posts/cglayer-no-longer-recommended/
opaque
具有纯色背景颜色的 View alpha
和 layer.opacity
小于 1.0layer.shouldRasterize
(小心使用)。我个人喜欢避免这种情况,但它在某些情况下执行得更快,因为图层的栅格将被缓存和重用。请记住,如果您启用 shouldRasterize
在频繁更改其内容或子图层内容的图层上会导致性能下降,因为 iOS 会在每次更改时继续栅格化图层。链接
关于iphone - 什么触发了 iOS 中的离屏渲染、混合和 layoutSubviews?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13158796/