IOS性能-核心动画,离屏渲染和系统跟踪。 第二部分



如何避免Core Animation预设的性能问题,用于跟踪代码段的功能以及将应用程序中的计算操作所占比例从26%降低到0.6%的功能-请根据去年MBLT DEV会议上Luke Parham的报告的内容阅读本文的第二部分。 本文的第一部分在这里


在猫的帮助下,不仅有用的提示,而且是MBLT DEV 2018的最新早鸟票 -您只能在今天购买。


核心动画


核心动画(CA)是事件探查器中的预设,它使用FPS测量(每秒帧)来查看动画是否滞后。 通常,即使找到了应用程序的问题区域,性能仍然存在困难。 原因是在使用UI框架时,使用了UIView,但是在后台创建了一个CATransaction实例(或者系统自己执行了此操作),并将所有这些指令发送到服务器进行处理。 用于渲染的服务器负责创建动画。 如果使用UIView(例如animate(withDuration:animations:)类方法)执行动画,则animate(withDuration:animations:)将由渲染服务器处理,该服务器被视为单独的线程,并且可以与应用程序中的所有动画一起使用。


您可以使渲染服务器缓慢运行,以便它不会出现在Time Profiler中,但仍会使应用程序变慢。 看起来是这样的:







顶部是帧速率传感器。 以下是最重要的部分-调试选项。 有两个关键且易于配置的参数。 首先是color blended layers 。 修复它非常简单。 实际上,苹果最受欢迎的应用程序iMessage甚至会出现问题。




红色表示具有白色背景的区域。 它们与另一个白色背景重叠,并且由于某种原因显得透明。 事实证明,该程序将这些颜色彼此混合-白色与白色,结果再次变为白色。 结果,对于标记为红色的每个像素,将执行不带来任何好处的额外计算-获得白色背景。


规则3


尽可能使图层不透明-前提是它们具有相同的重叠颜色。 该图层具有opacity属性,必须将其设置为unitity。 始终检查是否设置了背景色并且它是不透明的。




屏幕外渲染


下一个选项是屏幕外渲染。 如果启用此功能,这些部分将以黄色突出显示。

Core Animation的便利之处在于可以查看其他应用程序。 您可以打开选项,启动应用程序,然后查看出了什么问题。 在顶部的Instagram屏幕上,有一个黄色的小圆圈,其中显示了用户的故事。




例如,在iPhone 6s上,它们加载速度很慢。 而且,如果您在iPhone 5或旧版iPod上观看它们,下载速度会更慢。 这是由于以下事实:系统内渲染比alpha混合差得多。 它加载GPU。 结果,设备必须在图形处理器和中央处理器之间不断执行附加计算,因此在大多数情况下可以避免附加延迟。


规则4


不要使用cornerRadius参数。 使用viewLayer.cornerRadius导致屏幕外渲染。 相反,可以使用UIBezierPath类,以及与CGBitMap相似的功能,就像以前的JPEG解码一样。 在这种情况下,将使用UIGraphics context




这是UIImage类的另一个实例方法。 在这里您可以设置尺寸并制作圆角。 Bezierpath用于突出显示图像区域。 然后,片段从UIImageContext返回。 因此,我们得到的成品图像带有圆角,而不是将要插入图像的框架变圆。




在GIF-Twitter页面上。 实时显示的图像。 该页面应该可以打开并提供信息,但是屏幕上的文本和其他元素会经过屏幕外渲染,因此动画的移动非常缓慢。


规则5


CALayer集中的shouldRasterize类的属性允许您缓存已渲染的纹理。 最好避免它。 如果在一定的毫秒数内未使用shouldRasterize ,它将离开缓存并提供每个帧的呈现。 因此,这带来的问题多于弊。


加快速度


  • 避免屏幕外渲染和混合透明层。
  • 仅当您不能没有它们时才使用它们。 由于存在阴影,圆角等,因此出现了屏幕外渲染。
  • 使图像不透明。
  • 不要使用cornerRadius,请使用Bezier曲线。
  • 处理文本时,请勿使用layer.shadow属性,而应将其替换为NSShadow。


活动追踪


活动跟踪类似于Time Profiler的活动,但规模较小。 它使您可以考虑流及其相互之间的相互作用。

规则6


使用系统跟踪来跟踪特定事件的时间段。 您可以想出一种方法来跟踪事件或代码段,并查看它们在应用程序的实际工作中花费了多少时间。 系统跟踪提供有关系统中发生的情况的信息:


  • “新加坡邮政”表示发生了重要的事情。
  • 标记是值得关注的单个事件,例如动画的外观。
  • 通过事件间隔,您可以跟踪解码需要多长时间。




因此,该程序说明了代码如何与系统的其余部分进行交互。


屏幕上是创建系统跟踪模板的示例:


  • 1-图片上传
  • 2-图像解码
  • 3-倾斜动画。

您需要添加一些选项以了解会变成哪种颜色。 通常,为它们分配数字,例如1或2,并且根据设置,它们变为红色或绿色。 在Objective-C上,您需要为kdebug_signpost编写#import命令。 在Swift中,它们已经可用。




然后,您需要通过kdebug_signpostkdebug_signpost_startkdebug_signpost_end来调用此函数。




我们指示3个事件以及代码中写入的数字,以及每个特定事件的关键元素。 最后一个数字表示颜色。 例如,2是红色。


接下来是重要事件,特殊对象。 Luke在Swift上的测试项目中描述了简化图。


屏幕截图显示了开始跟踪时的外观。 首先,启动应用程序时,程序不会提供信息,但是一旦应用程序崩溃,我们将看到计算结果。




下载图像大约需要200毫秒。 然后是解码,大约需要40毫秒。 如果应用程序中有许多操作,则跟踪此数据很有用。 您可以在程序中列出事件,然后观察并接收有关实现它们需要多少时间以及它们如何交互的信息。


其他工具


在屏幕上-用于智能手机慢动作拍摄的AR项目。 该应用程序类似于Snapchat。 它使用照片修饰效果,每帧花了26.4%的所有计算操作。 因此,相机拍摄速度很慢,大约每秒10帧。 在学习时,我们发现最上面的一行完成了大部分工作。 她负责主动发送数据。 如果检查性能NSDispatchData的原因,您会发现关键是大量使用了NSDispatchData




NSData此子类仅在一定时间间隔内使用getBytes方法接收字节序列,并将其传递到另一个位置。 这似乎很简单,但是,此方法在内部所做的所有事情都需要26%的计算的18%。




规则1


使用NSDatagetBytes 。 这是在Objective-C上的简单操作,但是如果它导致系统出现问题,则应切换到普通C上的较低级别的函数。由于问题在于获取浮点值,因此可以使用复制内存功能。 有了它,您可以将一条数据移动到另一个位置。 这大大节省了设备的计算能力。

NSData有很多操作。 在示例中,源代码以红色突出显示。 使用getBytes函数,可以将数据转换为浮点数。 复制内存的方法几乎相同。 它非常简单,并且执行的操作要少一个数量级。




如果您更改方法并再次启动应用程序,则可以看出,用于更改照片的计算操作百分比从26%降低到0.6%。 这是由于只更改了有关复制内存的一行代码。 帧速率已大大提高。




规则2


创建具有渲染功能的应用程序时,避免彼此重叠的像素。

在大多数情况下,这将以每秒60帧以上的频率发生。 使用CADisplayLink ,可以减慢UI的更新速度。 有一个preferredFramesPerSecond参数。 它仅适用于iOS 10及更高版本。 对于较旧的系统,您必须手动执行此操作。 在新版本的iOS中工作时,您可以设置所需的每秒帧数。 在大多数情况下,每秒15帧左右,以免浪费计算能力,也不会给应用程序增加不必要的工作。




规则3


使用Objective-C时,使用IMP指针(指向方法实现的指针)的缓存很有用。 在Objective-C中调用objc_msgSend()方法时,将objc_msgSend()函数。 如果跟踪显示该呼叫花费很长时间,则可以摆脱它。 实际上,这是一个带有函数指针的缓存存储库,可以为它们指定一些方法的名称。 因此,值得进行以下缓存,而不是每次都执行此搜索:将函数指针放在缓存中并直接调用它们。 这通常以两倍的速度发生。




如果没有指针,则使用methodForSelector命令调用该方法。 要调用常规调用函数的这种帮助方法,您需要在选择器中输入对象的名称,该选择器将产生搜索结果。 也许这不是最方便的方法,而是最快的方法。


规则4


不要使用ARC(自动参考计数)。 ARC增加了很多额外的工作。


启用ARC后,编译器本身的分散状态会在正确的位置进行retain / release 。 但是,如果在某些地方retainrelease时间太长,请考虑删除ARC。 如果需要优化,请执行此操作,因为这将花费大量时间。


有时甚至值得放弃Swift,尤其是在应用程序性能对变化敏感的情况下。 Swift具有一些非常酷的功能,但是为了执行甚至很小的任务,它需要编写许多代码行才能实现高级功能。


有用的材料


本文的第一部分在这里 。 为了进一步了解该主题,Luke Parham建议阅读“ iOS和MacOS:性能调优 ”这本书并观看其教程


Luke关于MBLT DEV 2017的报告的视频记录现在已在公共领域:



MBLT DEV 2018上的更多知识和提示


第一位发言人宣布:


  • Netflix的约翰·C·福克斯(John C.Fox)将谈论高质量的本地化,以及积极的网络条件和A / B测试。
  • 纽约时报的KrzysztofZabłocki正在准备有关iOS模式的报告。
  • Google开发人员专家Laura Morinigo谈到了Firebase的最佳实践。

最新的早鸟票今天将飞走。


Source: https://habr.com/ru/post/zh-CN415543/


All Articles