【Android】屏幕刷新机制(概览)

发布于:2025-03-29 ⋅ 阅读:(26) ⋅ 点赞:(0)

Android 屏幕刷新机制旨在确保屏幕上的内容能够流畅、稳定且及时地更新,为用户呈现出连贯的视觉效果。其核心在于按照一定的频率(通常以赫兹为单位,如常见的 60Hz,意味着每秒刷新 60 次)对屏幕进行重绘,使得新的画面能够逐帧显示出来,避免出现卡顿、撕裂等显示问题。

目录

前言

1. 帧率

定义

原理及作用

2. 流畅度

定义

影响因素及关系

3. 卡顿

4. 掉帧

5. 画面撕裂

一、屏幕刷新机制的主要组成部分及流程

1. 应用层绘制

发起绘制请求

绘制操作

2. 系统服务层调度

SurfaceFlinger 组件

VSync 信号同步

3. 显示硬件层显示

显示控制器与屏幕

二、VSync 信号

1. 作用原理

2. 与卡顿、掉帧的关联

三、垂直同步机制

1. 原理

2. 原理

3. 与屏幕刷新机制的关联

(1)画面绘制的同步引导

(2)系统层级间的协同调度

(3)避免画面问题


前言

1. 帧率

定义

帧率(Frame Rate)指的是在单位时间内(通常以秒为单位),屏幕上连续显示的图像帧数,单位为 “帧 / 秒”,英文缩写是 “fps”(Frames Per Second)。简单来说,就是每秒钟能够展现多少张静态画面。例如,30fps 意味着每秒可以显示 30 张静态画面,60fps 则表示每秒能呈现 60 张静态画面。

原理及作用

我们看到的屏幕上动态、流畅的影像,实际上是由许多静止的图像快速切换形成的视觉效果,就如同快速翻动的画册能让里面的图画看起来像在动一样。帧率越高,单位时间内显示的画面数量越多,画面之间的过渡就越自然、连贯,给人眼的视觉感受也就越流畅。比如在播放视频或者运行游戏时,较高的帧率能让动作、场景的变化显得更加顺滑,细节展现得也更清晰。

2. 流畅度

定义

流畅度是一种综合的视觉感受指标,用来描述用户观看屏幕上的内容(如视频、动画、应用界面操作等)时,所感受到的画面连贯性、顺滑程度以及操作响应及时性等方面的体验效果。它不仅仅取决于帧率这一个因素,还和画面的渲染质量、响应时间、有无卡顿掉帧等多种情况相关。

影响因素及关系

(1)帧率影响

帧率是影响流畅度的关键因素之一。一般来说,帧率越高,流畅度往往越好。例如,60fps 的视频通常会比 30fps 的视频看起来更加流畅,玩游戏时达到 60fps 的帧率,人物的动作、场景切换等都会显得自然顺滑,操作起来也感觉灵敏。但如果帧率过低,比如低于 20fps,画面就会出现明显的卡顿、跳跃感,流畅度就很差了。

(2)其他因素影响

然而,流畅度并非只由帧率决定。即使帧率较高,但画面存在渲染错误、撕裂(图像的一部分和另一部分没有对齐等情况)现象,或者操作响应有延迟(比如点击按钮后要等一会儿才有反应),也会影响整体的流畅度感受。另外,像在一些动画过渡效果中,如果过渡不自然,即使帧率达标,流畅度也会大打折扣。

总的来说,帧率是一个可以量化衡量画面显示速度的指标,而流畅度则是基于用户实际观看和操作体验来评判画面整体连贯性、顺滑性的一种主观感受,二者紧密相关但又不完全等同,在评估 Android 设备上应用、视频、游戏等的显示效果时都非常重要。

3. 卡顿

当你操作 Android 设备上的应用时,比如滑动屏幕浏览列表、点击按钮切换界面等,如果操作后,界面没有立刻响应,出现短暂的 “停顿”,就好像反应慢半拍一样,这种现象就是卡顿。

例如,你在相册里快速滑动查看照片,结果手指滑动后,照片要过一会儿才跟着动起来,这中间的延迟感就是卡顿带来的。

4. 掉帧

我们看到的手机屏幕上流畅的画面,其实是由一帧一帧的静态图像快速切换组成的,就像快速翻动的画册看起来人物好像在动一样。正常情况下,这些帧会按照一定的频率(比如每秒 60 帧,即 60fps)依次显示,画面看起来就很流畅。

而掉帧就是指在本该连贯显示的帧序列里,丢失了某些帧或者帧与帧之间的切换不顺畅,导致画面出现短暂的不连贯、闪烁或者跳跃感。比如,看视频时画面突然卡一下,或者玩游戏时人物动作变得一顿一顿的,这就是出现了掉帧现象。

5. 画面撕裂

画面撕裂是一种在屏幕显示过程中出现的视觉异常现象。

画面撕裂通常表现为屏幕上同时显示出了两帧不同画面的部分内容,使得图像看起来好像被 “撕裂” 成了几块,有明显的割裂感,破坏了画面的连贯性和完整性,严重影响视觉体验。

比如在观看视频时,可能会看到人物的上半身是某一帧的动作,下半身却是另一帧的动作,或者玩游戏时,场景的左边部分是前一时刻的画面,右边部分却是下一时刻更新后的画面,整个画面就像被从中间撕开了一样,显得很不协调。

一、屏幕刷新机制的主要组成部分及流程

1. 应用层绘制

发起绘制请求

当应用中的界面有更新需求时,比如界面元素的位置变化、图片的切换、文本内容的更新等,应用的 UI 线程(主线程,负责处理用户交互和更新界面)会通过调用系统提供的相关绘图 API(如 View 类的 invalidate 方法等)发起绘制请求。这个请求标志着界面需要重新绘制,通知系统去更新相应的屏幕区域。

绘制操作

一旦接收到绘制请求,UI 线程会开始执行绘制流程,它会遍历整个视图树(由各种 UI 组件,如TextView、ImageView等组成的树形结构,体现了界面的层次关系),按照从上到下、从父到子的顺序,对每个需要更新的视图进行测量(确定其大小、位置等参数)、布局(将各视图放置在合适的屏幕位置上)和绘制(将视图的内容,如图像、文字等以像素形式呈现出来)操作,最终生成一帧完整的待显示画面数据,这个过程涉及大量的计算和图形处理,完成后会将绘制好的画面数据传递给系统的下一层级进行处理。

2. 系统服务层调度

SurfaceFlinger 组件

在 Android 系统中,SurfaceFlinger 扮演着关键的调度角色。它负责收集来自各个应用绘制好的画面数据(以 Surface 为单位,每个 Surface 可以理解为一个应用或者一个窗口对应的画面内容),然后根据各个窗口的层级、透明度等属性,对这些画面进行合成。例如,当有多个应用的窗口同时显示在屏幕上(像悬浮窗与普通应用界面叠加的情况),SurfaceFlinger 会按照设定的规则将它们合成为一个最终的画面,准备提供给显示硬件进行显示。

VSync 信号同步

为了保证屏幕刷新的有序性和流畅性,系统引入了 VSync(垂直同步)信号机制

VSync 信号由硬件(通常是屏幕的显示控制器)按照固定的频率(如 60Hz 对应的每 16.67 毫秒一次)发出,这个信号就像是一个节拍器,通知系统各层级何时进行相应的操作。

SurfaceFlinger 会等待 VSync 信号到来后,才将合成好的画面数据传递给显示硬件,确保画面的更新与屏幕的刷新频率同步,避免画面撕裂等问题。

3. 显示硬件层显示

显示控制器与屏幕

显示硬件层主要由显示控制器(它是连接系统与屏幕的关键部件,负责接收来自系统的画面数据并控制屏幕显示)和屏幕本身组成。

当 SurfaceFlinger 传递来合成好的画面数据后,显示控制器会按照屏幕的物理特性(如分辨率、像素格式等),将这些数据转化为可以驱动屏幕显示的电信号或者光信号,然后逐行、逐像素地控制屏幕进行显示,使得用户最终能看到更新后的画面内容。

二、VSync 信号

1. 作用原理

VSync 信号是整个屏幕刷新机制的核心节拍。它以固定的时间间隔触发,每次触发时,就像是给系统各层级下达了 “开始行动” 的指令。

  • 对于应用层来说,它知道要在 VSync 信号到来后尽快完成绘制工作,将新的画面准备好;
  • 对于 SurfaceFlinger,它要在 VSync 信号到达时,把收集和合成好的画面准确地传递给显示硬件;
  • 而显示硬件则依据 VSync 信号来确定何时开始将画面数据显示在屏幕上,这样就保证了整个屏幕刷新流程的有序和同步。

2. 与卡顿、掉帧的关联

如果应用层绘制耗时过长,没能在相邻两个 VSync 信号间隔内完成绘制,就会导致错过这一次屏幕刷新的机会,出现掉帧现象,画面看起来就会有卡顿、不连贯的感觉。

例如,一个复杂的游戏界面,由于要处理大量的图形渲染和计算,导致其绘制过程超过了 16.67 毫秒(在 60Hz 刷新率下),那当下一次 VSync 信号到来时,画面还没准备好,这一帧就无法按时显示,造成了掉帧和卡顿。

三、垂直同步机制

1. 原理

垂直同步(Vertical Synchronization,简称 VSync)是一种用于协调图形显示与屏幕刷新的技术机制,旨在确保屏幕上显示的图像内容更新与屏幕本身的物理刷新过程能够同步进行,避免出现画面显示异常的情况,从而为用户提供更流畅、稳定且视觉效果良好的观看体验。

2. 原理

在显示设备(如手机、电脑显示器等)中,屏幕是按照一定的频率进行刷新的,这个频率通常以赫兹(Hz)为单位来衡量,常见的有 60Hz、90Hz、120Hz 等。这意味着屏幕每秒钟会进行对应次数的重绘操作,每次重绘就会更新一帧画面。例如,60Hz 的屏幕,每 16.67 毫秒(1 秒 ÷60)就会刷新一次屏幕,展示新的一帧画面。

而垂直同步信号是由显示设备的硬件(一般是屏幕的显示控制器)按照屏幕的刷新频率定时发出的一种脉冲信号,它相当于一个节拍器或者定时指令,来协调不同层级的图形处理和显示相关的操作。

3. 与屏幕刷新机制的关联

(1)画面绘制的同步引导

在 Android(以及很多其他操作系统的图形显示系统中)屏幕刷新机制里,应用层负责绘制需要显示的画面内容,比如应用界面上的各种元素变化(文本更新、图片切换、按钮状态改变等)都需要重新绘制画面。应用会在接收到垂直同步信号后,知晓当前是一个合适的时间节点来启动或完成画面绘制工作,以便能及时将绘制好的画面提交给后续的系统层级进行处理,进而赶上屏幕的下一次刷新,使得画面能够准时显示在屏幕上。

例如,在一个游戏应用中,游戏场景中的角色移动、特效变化等都需要更新画面进行展示,开发人员会基于垂直同步信号来安排绘制逻辑,确保每次 VSync 信号到来时,相关的绘制任务能够有序进行,保证画面更新与屏幕刷新同步,避免出现画面更新不及时导致的卡顿或者画面撕裂等问题。

(2)系统层级间的协同调度

SurfaceFlinger 层面

SurfaceFlinger 是 Android 系统中负责将各个应用绘制好的画面(以 Surface 为单位,每个 Surface 可看作是一个应用或窗口对应的画面内容)进行合成的关键组件。它会等待垂直同步信号的到来,只有接收到这个信号后,才会把收集并合成好的最终画面传递给显示硬件,以此确保传递过去的画面正好能匹配屏幕的下一次刷新,避免出现画面内容与屏幕刷新不同步而造成的画面撕裂(即屏幕上同时出现两帧不同画面的部分内容,视觉上有割裂感)等显示质量问题。

显示硬件层面

显示硬件(如显示控制器和屏幕本身)依赖垂直同步信号来确定何时开始将接收到的画面数据进行实际的显示操作。它按照垂直同步信号的节奏,在信号到来时,将从 SurfaceFlinger 获取到的画面数据转化为电信号或光信号,逐行、逐像素地驱动屏幕进行显示,实现画面与屏幕物理刷新的完美契合。

(3)避免画面问题

如果没有垂直同步机制或者绘制过程不遵循垂直同步信号来进行,就容易出现一些画面显示问题。比如,若应用绘制画面的速度跟不上屏幕刷新频率,且没有依据 VSync 信号来协调,可能导致画面更新不及时,出现掉帧、卡顿现象,影响用户体验;而若画面提交给显示硬件的过程与屏幕刷新不同步,就可能出现画面撕裂问题,使屏幕上呈现出破碎、不连贯的视觉效果。

总之,垂直同步在屏幕刷新机制中起着核心的协调与同步作用,它通过定时的信号来规范从画面绘制、合成到最终显示的各个环节,保障整个屏幕显示过程的流畅性、稳定性以及画面的完整性。


网站公告

今日签到

点亮在社区的每一天
去签到