17

我应该注意哪些对性能至关重要的事情?

我想要一个包含尽可能多示例的列表。或最佳实践列表。

4

1 回答 1

51

离屏渲染/在 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.borderWith和的层layer.borderColor
    缺少参考/证明

  • 文本(任何类型,包括UILabelCATextLayerCore Text等)。

  • CGContextdrawRect:. 即使是一个空的实现也会被渲染到屏幕外。


混合


布局

以下内容将触发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:而不是使用具有多个标签和子视图的视图。

  • 在后台队列上绘制到 aUIImageCGImageRef

  • 绘制到 a (与 相比,CGLayer它的缓存更好),然后将您想要的任何内容绘制到其中。 更新,不要:http: //iosptl.com/posts/cglayer-no-longer-recommended/GPUUIImage

  • 扁平化你的层次结构

  • 重用视图——不要在滚动时创建和添加新视图

  • 具有opaque纯色背景色的视图

  • 避免设置alphalayer.opacity小于 1.0

  • 启用layer.shouldRasterize(小心使用)。我个人喜欢避免这种情况,但它在某些情况下执行得更快,因为图层的栅格将被缓存和重用。请记住,如果您shouldRasterize在图层上启用频繁更改其内容或子图层内容会导致性能下降,因为 iOS 会在每次更改时继续栅格化图层。


链接

于 2012-11-30T16:27:36.140 回答