掉帧和卡顿

定义

在 iOS 开发中,“卡顿”和“掉帧”是指影响应用程序流畅度的两种不同现象:

  1. 卡顿(Stuttering)

    • 定义:卡顿是指应用程序在运行过程中出现不连续、不流畅的情况。通常表现为操作的响应时间变长,界面突然停顿。
    • 原因:卡顿通常是由于在主线程上执行了过多的任务,比如大量的计算、I/O 操作、复杂的视图布局等。主线程被占用过久,导致无法及时响应用户的操作和刷新界面。
    • 解决方法:优化代码,将耗时的操作移到后台线程,使用异步任务处理,减少主线程的负担。
  2. 掉帧(Frame Drop)

    • 定义:掉帧是指在动画或滚动过程中,某些帧没有被及时渲染出来,导致动画不连贯,看起来有明显的卡顿感。
    • 原因:掉帧通常是因为在每秒 60 帧(每帧约 16.67 毫秒)的时间内,某一帧的渲染时间超过了这个限制。可能是由于复杂的动画、视图层级过深、大量的图片处理等。
    • 解决方法:优化动画和视图层次结构,使用 Core Animation 提供的工具进行性能调优,确保每一帧的渲染时间在 16.67 毫秒内。

总的来说,卡顿和掉帧都会影响用户体验,但它们的根本原因和解决方法略有不同。在开发过程中,可以使用 Xcode 提供的 Instruments 工具进行性能分析,找出问题所在并加以优化。

CPU和GPU

在 iOS 开发中,卡顿和掉帧问题的根源可以涉及到 CPU 和 GPU 的协同工作。了解这两者的职责分工有助于更好地定位和解决性能问题。

CPU 和 GPU 的职责
  1. CPU(中央处理器)

    • 职责:处理应用程序的逻辑、视图布局计算、数据处理、事件响应等。CPU 负责准备渲染的数据,包括计算视图的布局、处理动画的关键帧、解码图片等。
    • 导致的性能问题:如果 CPU 需要执行大量复杂的计算或处理大量数据,可能会导致主线程阻塞,造成卡顿现象。CPU 工作过重也会延迟向 GPU 提供渲染数据,进而引发掉帧。
  2. GPU(图形处理器)

    • 职责:负责渲染图形,将视图和动画绘制到屏幕上。GPU 的主要任务是处理图形计算,如图形的合成、纹理映射、绘制图层等。
    • 导致的性能问题:如果 GPU 需要处理大量复杂的图形计算,比如过多的视图层次、复杂的阴影和透明效果等,可能会导致每帧的渲染时间超过 16.67 毫秒(对于 60 FPS),从而导致掉帧。

iOS 界面渲染与优化(一) - CPU与GPU干了啥事儿

卡顿和掉帧的主要控制因素

  • 卡顿(Stuttering)

    • 主要控制因素:通常与 CPU 相关,因为卡顿通常是由于在主线程上执行了大量的计算任务,导致界面更新和事件响应延迟。
  • 掉帧(Frame Drop)

    • 主要控制因素:与 CPU 和 GPU 都相关。CPU 如果未能及时准备好数据,GPU 就无法顺利渲染帧;同样,GPU 如果在渲染过程中负担过重,无法在预定时间内完成帧的绘制,也会导致掉帧。
解决方法
  • 优化 CPU 性能

    • 使用多线程技术,将耗时操作放到后台线程。
    • 优化算法和数据结构,减少不必要的计算。
    • 使用 Instruments 工具分析 CPU 使用情况,找出性能瓶颈。
  • 优化 GPU 性能

    • 减少视图层次,避免过深的视图层级。
    • 尽量使用简单、合适的图形效果,避免复杂的阴影和透明效果。
    • 合理使用图片资源,避免大图片的频繁重绘。
    • 使用 Instruments 工具中的 Core Animation 分析,优化 GPU 渲染性能。

总之,在开发过程中,使用合适的工具进行性能分析,针对 CPU 和 GPU 的不同问题进行优化,可以有效提升应用的流畅度,减少卡顿和掉帧现象。

离屏渲染

在 iOS 开发中,离屏渲染(Offscreen Rendering)是指在屏幕外的缓冲区中渲染内容,然后再将其合成到屏幕上显示。离屏渲染可能会导致性能问题,特别是卡顿和掉帧,原因如下:

离屏渲染的工作原理

离屏渲染的过程通常包括以下几个步骤:

  1. 创建离屏缓冲区:系统分配一个内存区域来存储离屏渲染的内容。
  2. 渲染到离屏缓冲区:在这个缓冲区中进行绘制操作,比如绘制图层的阴影、圆角、蒙版等效果。
  3. 将离屏缓冲区内容合成到屏幕:将离屏缓冲区中的内容合成到最终的屏幕显示中。
离屏渲染对性能的影响

离屏渲染会带来额外的性能开销,主要表现为:

  1. 增加内存开销:创建和维护离屏缓冲区需要额外的内存。
  2. 增加绘制时间:需要额外的时间将内容渲染到离屏缓冲区,然后再合成到屏幕,这个过程涉及额外的计算和数据传输。
  3. 增加 GPU 工作量:GPU 需要处理更多的渲染任务,特别是在渲染复杂效果时,可能会导致 GPU 负担过重。
离屏渲染导致卡顿和掉帧的原因
  1. 卡顿

    • CPU 负担增加:如果离屏渲染涉及复杂的计算和视图布局,CPU 需要更多时间来准备数据,可能导致主线程阻塞,出现卡顿。
    • I/O 操作增加:离屏渲染需要频繁地在内存中创建和销毁缓冲区,增加了 I/O 操作的负担。
  2. 掉帧

    • GPU 负担增加:离屏渲染需要 GPU 进行额外的渲染操作,如果每帧的渲染时间超过 16.67 毫秒(对于 60 FPS),就会出现掉帧。
    • 合成开销增加:将离屏缓冲区内容合成到屏幕增加了额外的合成步骤,可能导致帧率下降。
常见导致离屏渲染的情况
  • 图层阴影(Shadow):设置图层的 shadowOpacityshadowOffsetshadowRadius 等属性。
  • 图层圆角(Corner Radius):设置图层的 cornerRadius 属性,并同时启用了 masksToBounds
  • 图层蒙版(Mask):设置图层的 mask 属性或使用 maskToBounds
  • 透明度(Opacity):设置视图的 alpha 属性。

iOS卡顿优化-CSDN博客

优化离屏渲染的方法
  • 减少使用离屏渲染的效果:尽量避免或减少使用阴影、圆角、蒙版等需要离屏渲染的效果。
  • 合并图层:将多个需要离屏渲染的图层合并为一个图层,减少离屏渲染的次数。
  • 使用图像替代:在可能的情况下,使用预渲染的图像来代替动态渲染的效果,减少实时计算的开销。
  • 优化视图层级结构:简化视图层次结构,减少图层的数量和复杂度。

通过理解离屏渲染的工作原理和其对性能的影响,可以更好地优化 iOS 应用的界面渲染,减少卡顿和掉帧现象,提高用户体验。

CPU 和 GPU 

在 iOS 开发中,GPU(图形处理器)和 CPU(中央处理器)在处理图形渲染时各自承担不同的任务,而离屏渲染是一个涉及两者的过程。了解 GPU 和 CPU 的职责分工以及它们如何协同工作来处理离屏渲染,可以帮助优化应用性能,减少卡顿和掉帧现象。

CPU 和 GPU 的职责
  1. CPU(中央处理器)

    • 主要职责:负责应用程序的逻辑、视图布局计算、事件处理、网络请求和数据处理等。
    • 在渲染过程中的角色
      • 计算视图的布局和位置。
      • 准备绘制数据和命令,将这些数据交给 GPU 进行渲染。
      • 处理动画的关键帧计算。
  2. GPU(图形处理器)

    • 主要职责:负责处理图形渲染,包括将图像绘制到屏幕上。
    • 在渲染过程中的角色
      • 接收来自 CPU 的绘制命令。
      • 执行具体的图形渲染操作,如绘制图层、处理阴影和透明效果等。
      • 将渲染好的图像合成到最终的屏幕显示。
离屏渲染的过程和影响
  1. 离屏渲染的过程

    • 离屏缓冲区创建:CPU 指示 GPU 创建一个离屏缓冲区(Offscreen Buffer),这个缓冲区在屏幕外的内存中。
    • 离屏渲染:GPU 在这个离屏缓冲区中进行绘制操作,比如处理复杂的图层效果(阴影、圆角、蒙版等)。
    • 合成到屏幕:完成离屏渲染后,GPU 将离屏缓冲区的内容合成到最终的屏幕显示中。
  2. 离屏渲染对性能的影响

    • CPU 负担:CPU 需要准备和发送更多的绘制命令,同时需要管理离屏缓冲区的创建和销毁,增加了计算和 I/O 操作的负担。
    • GPU 负担:GPU 需要执行额外的渲染操作,并管理离屏缓冲区的合成,这会增加 GPU 的工作量。
    • 内存开销:离屏缓冲区需要额外的内存,如果有多个复杂的离屏渲染操作,内存占用会显著增加。
    • 帧率下降:如果离屏渲染操作过于复杂,GPU 无法在 16.67 毫秒(对于 60 FPS)内完成所有渲染任务,会导致掉帧现象。
优化离屏渲染的方法
  1. 减少离屏渲染效果

    • 尽量减少使用需要离屏渲染的效果,如阴影、圆角和蒙版。
    • 如果必须使用这些效果,尽量简化它们,降低复杂度。
  2. 合并图层

    • 尽量将多个需要离屏渲染的图层合并为一个图层,以减少离屏渲染的次数。
  3. 优化视图层级结构

    • 简化视图层次结构,减少图层数量和复杂度,降低 GPU 的渲染负担。
  4. 使用预渲染的图像

    • 在可能的情况下,使用预渲染的静态图像代替动态渲染的效果,减少实时计算的开销。
  5. 使用 Instruments 工具

    • 使用 Xcode 提供的 Instruments 工具,特别是 Core Animation 分析器,来检测离屏渲染和其他性能瓶颈,并进行优化。
总结

CPU 和 GPU 在渲染过程中扮演着各自的角色,离屏渲染则是一个需要两者协同工作的过程。理解离屏渲染的工作原理及其对性能的影响,有助于在开发过程中进行有效的优化,减少卡顿和掉帧现象,提升应用的流畅度和用户体验。

测试页面流畅性是否掉帧(官方)  

🍎TECH TALK 2021
Explore UI animation hitches and the render loop
https://developer.apple.com/videos/play/tech-talks/10855/

Find and fix hitches in the commit phase
https://developer.apple.com/videos/play/tech-talks/10856/

       Demystify and eliminate hitches in the render phase
https://developer.apple.com/videos/play/tech-talks/10857/

其他参考网址:
Avoid hitches and discover the Render Loop
https://a11y-guidelines.orange.com/en/mobile/ios/wwdc/nota11y/2021/21hitches/#hitches

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值