zoukankan      html  css  js  c++  java
  • Core Animation Programming Guide

    Improving Animation Performance

    Core Animation 是一个用来提升基于 app 动画的框架率的伟大方式,但是它的使用也不能都保证性能的提升。尤其在 OS X 中,你需要选择更高效的方式使用 Core Animation 的行为。当遇到性能相关的问题时,你要花时间使用 Instruments 来测试和跟踪你的 app 的性能,以便你可以确保性能的提升而不是下降。

    Choose the Best Redraw Policy for Your OS X Views

    NSView 类默认的重绘策略保护了原始的绘制,即使视图是 layer-backed的。如果你正在你的 app 使用 layer-backed 视图,你必须检查重绘策略的选择,然后选择能提供最好性能的一个。大多数情况下,默认的策略并不是提供最好性能的那一个。NSViewLayerContentsRedrawOnSetneedsDisplay 策略可以最大话地减少你 app 地重绘次数来提升性能。其他的策略也可以为特定的视图类型提供更好的性能。

    关于视图重绘策略的更多信息,详见 The Layer Redraw Policy for OS X Views Affects Performance

    Update Layers in OS X to Optimize Your Rendering Path

    在 OS X v10.8 及以后,视图有两个更新 layer 内容下面的选项。当你在 OS X v10.7 和之前的系统中更新 layer-backed 的视图,layer 会从视图的 drawRect: 方法捕捉绘制命令然后放进后面的位图中。缓存绘制命令很有效但在所有的情况下并不是最有效的选择。如果你知道在不实际渲染它们时怎么直接地提供 layer 的内容,你可以使用 updateLyer 方法这样做。

    关于不同的渲染路径信息,包括包含 updateLayer 方法的这些,详见 Using a Delegate to Provide the Layer's Content.

    General Tips and Tricks

    有一些方法可以使你的 layer 表现的更高效。在使用这些优化前,你需要测试你的代码对当前性能。这样你才能知道你使用的优化是否有效。

    Use Opaque Layers Whenever Possible

    设置 layer 的 opaque 属性为 YES 使 Core Animation 知道它不需要为 layer 保持 alpha 通道。没有 alpha 通道意味着排版不需要把你的 layer 的内容和背景内容混合,可以节省渲染的时间。但是,这个属性主要针对 layer-backed 视图中的 layer 或 Core Animation 创建 layer 下面的位图。如果你为 layer 的 contents 属性直接赋值为一张图片,图片的 alpha 通道被保护,opaque 属性的值会被忽略。

    Use Simpler Paths for CAShapeLayer Objects

    CAShapeLayer 靠渲染你提供的路径创建自己的内容并在复合的时间放入到位图中。好处就是 layer 总是在最可能大分辨率下绘制路径,但是这种好处源自额外的渲染时间花费。如果你提供的路径比较复杂,像素化路径就比较昂可能就会太昂贵。而且如果 layer 的尺寸比较频繁的改变(这样必须频繁地重绘),花费在绘制上的时间就会增加变成性能的瓶颈。

    对于 shape layer 减小绘制时间的一个方式是把比较复杂多 shape 分成各个比较小多 shape。使用更简单的路径,把多个 CAShapeLayer 对象分层堆放后复合在一起,会比绘制一个大而复杂动路径更快。这是因为绘制操作是发生在 CPU 上,而复合的操作发生在 GPU 上。这种自然的简化会根据你的内容获得潜在的性能提升。因此,在优化之前测试你的代码性能久尤其重要了,这样才能有个比较的基线。

    Set the Layer Contents Explicitly for Identical Layers

    如果你正在多个 layer 对象里使用同一个图像,直接加载图像然后赋值给这些 layer 的 contents 属性。赋给 contents 属性一张图像以便 layer 不会为后台存储分配额外的内存。作为代替, layer 使用你提供的图像作为后台存储。当多个 layer 使用同一张图像时,意味着这些 layer 共享一块内存而不是各自分配一块内存储存图像。

    Always Set a Layer's Size to Integral Values

    为了最好的结果,要设置 layer 对象的宽和高为整数。尽管你使用浮点数设置 layer 边界的宽和高,layer 边框最终被用来创建一张位图。为宽和高指定证书值,可以简化 Core Animation 必须创建和管理后台存储盒其他的 layer 信息的工作。

    Use Asynchronous Layer Rendering As Needed

    你在委托的 drawLayer:inContext: 方法或者视图的 drawRect: 方法的任意一种绘制一般都是同步地发生在你 app 的主线程上。在一些情况下,同步的绘制可能提供不了最好的性能。如果你注意到你的动画表现的不尽人意,你可以试着在你的 layer 上启用 drawsAsynchronously 属性,把这些操作移到后台线程上。如果你这样做了,确保你的绘制代码上线程安全的。在把代码改为异步前,你需要测试异步绘制的性能。

    Specify a Shadow Path When Adding a Shadow to Your Layer

    让 Core Animation 决定形状的阴影是很昂贵的而且会影响 app 的性能。使用 CALayer 的属性 shadowPath 明确地制定外形的阴影比让 Core Animation 决定好的多。当你为这个属性指定一个路径对象时,Core Animation 使用那个形状会着喝缓存阴影效果。对于外形从不改变或者很少改变的 layer,这依靠降低被 Core Animation 渲染的量极大地提升了性能。

  • 相关阅读:
    CocoaPods
    Git
    LLVM
    浅入浅出数据结构(11)——简要介绍算法时间复杂度
    浅入浅出数据结构(10)——树的简介
    浅入浅出数据结构(8)——栈、后缀表达式与四则运算计算器
    浅入浅出数据结构(7)——特殊的表:队列与栈
    浅入浅出数据结构(6)——游标数组及其实现
    浅入浅出数据结构(5)——链表的操作
    浅入浅出数据结构(4)——线性表与链表
  • 原文地址:https://www.cnblogs.com/1oo1/p/4276133.html
Copyright © 2011-2022 走看看