iphone - 什么触发了 iOS 中的离屏渲染、混合和 layoutSubviews?

标签 iphone ios cocoa core-animation

我应该注意哪些对性能至关重要的事情?
我想要一个包含尽可能多示例的列表。或最佳实践列表。

最佳答案

离屏渲染/在 CPU 上渲染
图形性能的最大瓶颈是屏幕外渲染和混合——它们可能发生在动画的每一帧中,并可能导致不连贯的滚动。
屏幕外渲染(软件渲染)发生在必须在软件(屏幕外)中进行绘图之前,然后才能将其移交给 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 ?
    缺少引用/证明
  • 文本(任何类型,包括 UILabelCATextLayerCore Text 等)。
  • 您使用 CGContext 绘制的大部分绘图在 drawRect: .即使是一个空的实现也会被渲染到屏幕外。

  • 混合
  • resizableImage可能导致混合。
    Avoiding blended layers when using resizableImages on iOS
  • 任何不是 opaque 的层并且有一个 backgroundColoralpha小于 1.0
  • 任何带有 alpha 的层小于 1.0
  • 任何带有 layer.content 的层或任何 UIImageViewUIImage有一个阿尔法 channel

  • 布局
    以下情况会触发layoutSubviews在 UIView 上调用:
  • 更改 bounds在同一 View 和 super View 上触发
  • 更改 frame在同一 View 和 super View 上触发
  • 更改 transformlayer.transform在superview上触发

  • 注意:我指的是值实际发生变化的实际变化
    矛盾的这些更改不会触发 layoutSubviews被称为:center , layer.position , layer.zPosition , layer.anchorPoint , layer.anchorPointZ .
    引用:https://github.com/hfossli/LayoutSubviewsInconsistency

    提高性能的一般提示
  • 通常情况下,blend 更好。比 render offscreen .
  • 考虑使用 drawRect:而不是具有多个标签和 subview 的 View 。
  • 在后台队列上绘制到 UIImageCGImageRef .
  • 抽到CGLayer (与 GPU 相比,它在 UIImage 上的缓存更好),并在其中绘制您想要的任何内容。
    更新,不要:http://iosptl.com/posts/cglayer-no-longer-recommended/
  • 扁平化你的层次结构
  • 重用 View ——不要在滚动时创建和添加新 View
  • opaque具有纯色背景颜色的 View
  • 避免设置 alphalayer.opacity小于 1.0
  • 启用 layer.shouldRasterize (小心使用)。我个人喜欢避免这种情况,但它在某些情况下执行得更快,因为图层的栅格将被缓存和重用。请记住,如果您启用 shouldRasterize在频繁更改其内容或子图层内容的图层上会导致性能下降,因为 iOS 会在每次更改时继续栅格化图层。

  • 链接
  • http://iosinjordan.tumblr.com/post/56778173518/help-my-tables-dont-scroll-smoothly
  • https://developer.apple.com/library/IOS/documentation/2DDrawing/Conceptual/DrawingPrintingiOS/DrawingTips/DrawingTips.html
  • 关于iphone - 什么触发了 iOS 中的离屏渲染、混合和 layoutSubviews?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13158796/

    相关文章:

    iphone - 我可以在 iPhone 或 IPod 中编译 mysql、php(或者已经构建好的)吗?

    iphone - 如何在iPad App中显示这个?

    iphone - Gamer Center 排行榜不显示分数,每个用户只能访问自己的分数

    ios - Swift 3 - 长按 GMSMarker 并打印其坐标(Google Maps iOS SDK)

    ios - 模态翻转动画后 UINavigationBar 的高度发生变化

    ios - 如何裁剪较大的图像以适应以编程方式构建的 tabBarController 中的 tabBar 图标。

    iphone - 如何创建一个可以从不同 View Controller 访问的 NSMutable 数组

    ios - 如何使用设置包中的多值标题和值

    objective-c - 获取 Mac 操作系统中的文件类型

    objective-c - 显示 NSPopOver