惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
I
InfoQ
Y
Y Combinator Blog
The Last Watchdog
The Last Watchdog
博客园_首页
The Cloudflare Blog
博客园 - 【当耐特】
Engineering at Meta
Engineering at Meta
罗磊的独立博客
月光博客
月光博客
V
V2EX
大猫的无限游戏
大猫的无限游戏
腾讯CDC
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG
Stack Overflow Blog
Stack Overflow Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Attack and Defense Labs
Attack and Defense Labs
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Google Online Security Blog
Google Online Security Blog
B
Blog RSS Feed
Webroot Blog
Webroot Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
N
Netflix TechBlog - Medium
量子位
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Vercel News
Vercel News
C
CERT Recently Published Vulnerability Notes
人人都是产品经理
人人都是产品经理
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Recent Announcements
Recent Announcements
Cyberwarzone
Cyberwarzone
G
Google Developers Blog
H
Heimdal Security Blog
MyScale Blog
MyScale Blog
The Register - Security
The Register - Security
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
T
Tenable Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
O
OpenAI News
C
Check Point Blog
Forbes - Security
Forbes - Security
SecWiki News
SecWiki News
K
Kaspersky official blog
The GitHub Blog
The GitHub Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
F
Full Disclosure
阮一峰的网络日志
阮一峰的网络日志

Android Performance

SmartPerfetto 架构文章 Q&A:8 个深度技术问答 从 Trace 到洞察:SmartPerfetto AI Agent 的 Harness Engineering 实战 OpenClaw 常见问题解答:Token 消耗、能干什么、本地模型、隐私安全、使用体验 我把 OpenClaw 跑在本地三周后,发现它根本不是聊天机器人 Android Perfetto 系列 10 - Binder 调度与锁竞争 Android Perfetto 系列 9 - CPU 信息解读 Android Perfetto 系列 8:深入理解 Vsync 机制与性能分析 Android Perfetto 系列 7 - MainThread 和 RenderThread 解读 Android Perfetto 系列 5:Android App 基于 Choreographer 的渲染流程 Android Perfetto 系列 4:使用命令行在本地打开超大 Trace Android ANR 系列 3 :ANR 案例分享 Android ANR 系列 2 :ANR 分析套路和关键 Log 介绍 Android ANR 系列 1 :理解 Android ANR 设计思想 Android Perfetto 系列 3:熟悉 Perfetto View Android Perfetto 系列 2:Perfetto Trace 抓取 Android Perfetto 系列 1:Perfetto 工具简介 Android Perfetto 系列目录 2023 年的方方面面 关于 The Android Performance 知识星球介绍 The Performance Design Of OS OS 设计之性能设计 当 App 有了系统权限,真的可以为所欲为? The Performance 星球茶话会 - 第一期 Systrace 线程 CPU 运行状态分析技巧 - Sleep 和 Uninterruptible Sleep 篇 Systrace 线程 CPU 运行状态分析技巧 - Running 篇 Systrace 线程 CPU 运行状态分析技巧 - Runnable 篇 Android 性能优化的术、道、器 Techniques, Philosophy, and Tools for Android Performance Optimization 回顾 2021 一本讲 Android 流畅性的书,应该有什么内容? Android 系统开发系列(1):Android 12 源代码下载、编译和刷机 Android Systrace 响应速度实战 3 :响应速度延伸知识 Android Systrace 响应速度实战 2 :响应速度实战分析-以启动速度为例 Android Systrace 响应速度实战 1 :了解响应速度原理 Android Systrace 流畅性实战 3 :卡顿分析过程中的一些疑问 Android Systrace 流畅性实战 2 :案例分析 - MIUI 桌面滑动卡顿分析 Android Systrace 流畅性实战 1 :了解卡顿原理 华为手机刷微博体验更好?技术角度的一些分析和思考 一个「闰」字引发的事故 - 三星系统重启分析 Android App 链式唤醒分析 Android Systrace 基础知识 - SurfaceFlinger 解读 Android 开发者学习路线(2020 版本) 我的 2020 年读书单 Android Systrace 基础知识 - CPU Info 解读 Android Systrace 基础知识 - Triple Buffer 解读 Android Systrace 基础知识 - Binder 和锁竞争解读 「置顶」博客文章目录 Android Systrace 基础知识 - Vsync 解读 Android App 启动优化全记录 Android Systrace 基础知识 - MainThread 和 RenderThread 解读 Android Systrace 基础知识 - Input 解读 Android 中的“后台无效动画“行为分析 Android 基于 Choreographer 的渲染机制详解 Android 中的卡顿丢帧原因概述 - 低内存篇 Android 桌面被杀问题分析案例 Android 中的卡顿丢帧原因概述 - 应用篇 Android 中的卡顿丢帧原因概述 - 系统篇 Android 中的卡顿丢帧原因概述 - 方法论 Android 中的 Activity Launch Mode 详解 Android 中的 Hardware Layer 详解 Android Systrace 基础知识 -- 分析 Systrace 预备知识 Android Systrace 基础知识 - SystemServer 解读 Android Systrace 基础知识 -- Systrace 简介 Android Systrace 基础知识 -- Why 60 fps ? Android Systrace -- 系列文章目录 Android 新的流畅体验,90Hz 漫谈 利器 - 高效工具推荐 Android 无障碍服务导致的整机卡顿案例分析 2018 年度好物推荐 - 给辛勤工作的自己一点奖励 Android 系统开发源码环境搭建 陆奇:除了好代码,工程师怎样才算优秀? 程序员的修炼-08-阅读之美 程序员的修炼-07-游戏与编程 程序员的修炼-06-互联网那些事 程序员的修炼-05-了解你的用户 程序员的修炼-04-关于测试的一些思考 程序员的修炼-03-Web 设计原则 程序员的修炼-02-编程之道 程序员的修炼-01-绝地反击之术 Android 系统不释放内存吗? 关于 Android 系统流畅性的一些思考 知乎 救救你的 StartingWindow 「置顶」Android 性能优化必知必会 2017 年度好物推荐 - 给辛勤工作的自己一点奖励 2017 Android Bottom navigation 规范二:样式、行为与规格 Android Bottom Navigation 规范一:使用方法 Android 中如何计算 App 的启动时间? Android 应用启动优化:一种 DelayLoad 的实现和原理(下篇) Android 应用启动优化 - 一种 DelayLoad 的实现和原理(上篇) Android hwui 中 RenderThread 工作流程 Java7 HashMap 源码分析 Android 代码内存优化建议 - OnTrimMemory 优化 Android 代码内存优化建议 - Android 资源篇 Android 代码内存优化建议 - Android 官方篇 Android 代码内存优化建议 - Java 官方篇 Nexus6 with Android M 开启多窗口模式 细说 Java 单例模式 Android 性能优化典范 - Profile GPU Rendering Android 性能优化典范 - Understanding VSYNC
Android Perfetto 系列 6:为什么是 120Hz?高刷新率的优势与挑战
Gracker · 2025-04-26 · via Android Performance

本文是 Android Perfetto 系列的第六篇,主要介绍 Android 设备上 120Hz 刷新率的相关知识。如今,120Hz 已成为 Android 旗舰手机的标配,本文将讨论高刷新率带来的优势和挑战,以及从系统角度解析 120Hz 的工作原理。

在过去的几年中,移动设备的屏幕刷新率经历了从 60Hz 到 90Hz,再到现在普遍的 120Hz 的演进过程。这种提升不仅带来了更流畅的视觉体验,也对系统架构和应用开发提出了新的要求。通过 Perfetto 工具,我们可以更直观地理解高刷新率设备上帧渲染的过程和性能表现。

本文目录

  • 系列文章目录
  • 基本概念
  • 系统实现与工作原理
  • 120Hz 的优势与挑战
  • 思考与展望
  • 结论
  • 关于我 && 博客

系列文章目录

  1. Android Perfetto 系列目录
  2. Android Perfetto 系列 1:Perfetto 工具简介
  3. Android Perfetto 系列 2:Perfetto Trace 抓取
  4. Android Perfetto 系列 3:熟悉 Perfetto View
  5. Android Perfetto 系列 4:使用命令行在本地打开超大 Trace
  6. Android Perfetto 系列 5:Android App 基于 Choreographer 的渲染流程
  7. Android Perfetto 系列 6:为什么是 120Hz?高刷新率的优势与挑战
  8. Android Perfetto 系列 7 - MainThread 和 RenderThread 解读
  9. Android Perfetto 系列 8:深入理解 Vsync 机制与性能分析
  10. Android Perfetto 系列 9 - CPU 信息解读
  11. Android Perfetto 系列 10 - Binder 调度与锁竞争
  12. 视频(B站) - Android Perfetto 基础和案例分享
  13. 视频(B站) - Android Perfetto 分享 - 出图类型分享:AOSP、WebView、Flutter + OEM 系统优化分享

如果大家还没看过 Systrace 系列,下面是传送门:

  1. Systrace 系列目录 : 系统介绍了 Perfetto 的前身 Systrace 的使用,并通过 Systrace 来学习和了解 Android 性能优化和 Android 系统运行的基本规则。
  2. 个人博客 :个人博客,主要是 Android 相关的内容,也放了一些生活和工作相关的内容。

欢迎大家在 关于我 页面加入微信群或者星球,讨论你的问题、你最想看到的关于 Perfetto 的部分,以及跟各位群友讨论所有 Android 开发相关的内容

基本概念

什么是屏幕刷新率?

屏幕刷新率是一个硬件概念,指的是屏幕每秒钟刷新显示内容的次数,单位是赫兹(Hz)。

  • 60Hz 屏幕:每秒刷新 60 次,每次刷新间隔约 16.67ms
  • 90Hz 屏幕:每秒刷新 90 次,每次刷新间隔约 11.11ms
  • 120Hz 屏幕:每秒刷新 120 次,每次刷新间隔约 8.33ms

屏幕刷新率决定了显示设备能够展示的最高帧率,但屏幕只负责按固定频率显示内容,具体显示什么内容由软件系统决定。

什么是 FPS?

FPS(Frames Per Second)是一个软件概念,指的是系统每秒生成多少帧内容提供给屏幕显示。

  • 60FPS:系统每秒生成 60 帧内容,每帧有约 16.67ms 的处理时间
  • 90FPS:系统每秒生成 90 帧内容,每帧有约 11.11ms 的处理时间
  • 120FPS:系统每秒生成 120 帧内容,每帧有约 8.33ms 的处理时间

为了获得最佳的视觉体验,FPS 应该与屏幕刷新率匹配。如果 FPS 低于刷新率,会出现掉帧;如果 FPS 高于刷新率,多余的帧会被丢弃,造成资源浪费。

为了获得最佳的视觉体验,理想情况下 FPS 应该与屏幕刷新率匹配,但实际体验与内容类型和用户感知紧密相关:

  1. 内容类型差异
  • 视频内容:电影(24fps)或视频(30fps)即使在 120Hz 屏幕上也能看起来流畅,这是因为视频内容包含自然运动模糊,且符合观看者对该媒介的预期
  • 交互式界面:而滑动列表、动画等交互场景对帧率要求更高,从 120fps 降到 110fps 都可能被用户感知为卡顿
  1. 帧率稳定性:稳定的低帧率(如稳定的 60fps)通常比不稳定的高帧率(如在 90-120fps 之间波动)体验更好

  2. 系统行为

  • 当 FPS 低于刷新率时,显示系统会复用帧或插入黑帧
  • 当 FPS 高于刷新率时,多余的帧会被丢弃,造成计算资源浪费

不同应用场景有不同的流畅度标准,开发者需要根据应用类型选择合适的优化策略。

什么是 Vsync?

Vsync(垂直同步)是将软件帧率与屏幕刷新率同步的机制,目的是避免画面撕裂现象。Android 系统中,Vsync 信号被用来触发应用渲染新一帧的时机,确保渲染过程与屏幕刷新周期保持一致。

为什么 120Hz 成为新标准?

市场从 60Hz 到 90Hz,再到 120Hz 的演进有着明确的技术和用户体验驱动因素:

  1. 更高的流畅度:120Hz 比 60Hz 提供了两倍的视觉信息,使滑动、动画等交互感觉更加流畅自然。

  2. 减少延迟:输入事件到显示结果的延迟从 60Hz 的 16.67ms 减少到 120Hz 的 8.33ms,让用户操作反馈更及时。

  3. 硬件支持成熟:现代移动处理器(如高通骁龙 8 系列、联发科天玑系列)已经有足够性能支持 120Hz 的稳定运行。

  4. 电池技术进步:更高效的电池和电源管理技术缓解了高刷新率带来的功耗压力。

  5. 可变刷新率技术:LTPO 等自适应刷新率技术允许设备在不同场景下智能切换刷新率,平衡流畅度和功耗。

如今,120Hz 不仅是 Android 旗舰机型的标配,连 iOS 设备(iPhone 13 Pro 及以上)也已支持 120Hz 的 ProMotion 技术,标志着高刷新率已成为高端移动设备的基本特性。

系统实现与工作原理

Perfetto 视角下的 120Hz 渲染流程

在 120Hz 刷新率下,Android 系统的渲染流程没有本质变化,主要区别是每一帧的时间预算从 16.67ms 缩短到了 8.33ms ( 当然这里没有讨论 App duration,如果 App Duration 配置大于 8.33ms,那么 App 的 UI + Render 在 App duration 区间完成都是可以的,注意 每个机器的 App Duration 配置不一样)。下图展示了 120Hz 环境下应用渲染的 Perfetto 追踪图:

120Hz 下 App 的渲染流程

在 120Hz 设备上,我们会看到:

  1. Vsync 间隔:VSYNC 信号每 8.33ms 触发一次
  2. 帧处理流程:每一帧的处理依然遵循 Input → Animation → Traversal 的顺序
  3. 时间压缩:所有处理步骤必须在更短的时间内完成,对系统和应用性能要求更高

上图中出现了两个 Buffer 相关的 Trace,这里做一个简单的说明:

  1. QueuedBuffer:(例如:QueuedBuffer - VRI[ImproveSnsTimelineUI]#748BLAST#748)
  • 这个 Trace Tag 是在 App 进程中打印的
  • 表示应用完成一帧渲染后,将渲染好的 Buffer 放入队列准备提交给 SurfaceFlinger
  • 在使用 BlastBufferQueue 的系统中,这个时刻标志着 RenderThread 完成渲染并准备将结果传输到系统服务
  1. BufferTX:(例如:BufferTX - com.tencent.mm/com.tencent.mm.plugin.sns.ui.improve.ImproveSnsTimelineUI#47974)
  • 这个 Trace Tag 是在 SurfaceFlinger 进程中打印的
  • 表示 SurfaceFlinger 接收到应用传来的 Buffer 并开始处理的时刻
  • TX 代表 “Transfer/Transmission”,即缓冲区的传输过程

正确的流程应该是:

  1. App 的 RenderThread 调用 queueBuffer,此时 App 认为自己已交出一个 Buffer,于是 QueuedBuffer +1
  2. 该 Buffer 被传输给 SF,SF 接收(latch/acquire)后,BufferTX +1
  3. SF 在未来的某个 Vsync 周期,使用这个 Buffer 完成合成并上屏。
  4. 当 SF 不再需要这个 Buffer 时(例如,它已经被新的帧替换,或者已稳定显示了足够长的时间),SF 会释放(release)这个 Buffer。
  5. SF 释放 Buffer 后,BufferTX -1。同时,App 会收到 Buffer 已被释放的回调,此时 App 端的 QueuedBuffer 才会 -1,表示这个 Buffer 已成功返回缓冲池,可被再次使用。

Perfetto 同时也提供了 Buffer 追踪的功能,点击 App 上面的 Actual Timeline(这部分知识可以看 Actual Timeline 介绍),就能看到这个 Buffer 从生产到消费的全过程。

image-20250426150441133

支撑 120Hz 的系统架构优化

要流畅地支持 120Hz 高刷新率,Android 系统架构做了不少调整和改进。这些变化涉及多个组件,也包括了对整个渲染管线的重要优化。下面我们来详细看看几个关键的技术点:

自适应刷新率技术

现代 Android 设备采用多层次刷新率管理策略:

  • 硬件层支持:LTPO(低温多晶氧化物)显示技术允许屏幕在 1Hz 到 120Hz 范围内精确调节刷新率,而非固定档位切换

  • 内容感知算法:系统通过分析屏幕内容类型自动调整刷新率:

  • 静态内容(阅读、图片浏览):降至 10-30Hz

  • 视频播放:匹配视频源帧率(通常 24-60Hz)

  • 滚动和交互:提升至 90-120Hz

  • 游戏:根据游戏引擎输出帧率动态调整

  • API 支持:Android 提供 Surface.setFrameRate() API,允许应用明确指定其首选帧率,系统会尽可能满足这一请求

1
2
// 应用可以指定首选帧率和刷新率行为
surface.setFrameRate(60.0f, Surface.FRAME_RATE_COMPATIBILITY_DEFAULT);

120Hz 的优势与挑战

120Hz 带来的体验提升

我拿到第一台120Hz手机的时候,最直观的感受就是:

  1. 一切操作都变得更流畅:从桌面滑动、应用切换到刷微博,画面更新更频繁,内容跟随手指移动也更加精准。尤其在快速滑动朋友圈或微博feed流时,文字依然清晰可辨,而不是一片模糊。

  2. 游戏体验大幅提升:玩《王者荣耀》或《和平精英》这类竞技游戏时,画面流畅度提升让我的操作精准度也跟着提高。在激烈对抗中,能提前8ms看到敌人动作,虽然时间很短,但确实能带来优势。

  3. 眼睛疲劳感减轻:这点可能是个人感受,但长时间盯着120Hz屏幕确实比60Hz舒适,特别是阅读和滑动内容时,眼睛追踪内容的负担减轻了。

  4. 触控体验更精准:120Hz不仅是显示更新快,触控采样率通常也会提高,让操作响应更及时,无论是打字还是精细控制都更准确。

120Hz 面临的实际问题

当然,高刷屏幕也带来了一系列技术挑战:

  1. 功耗问题:实测中,同一台手机在120Hz模式下比60Hz大约多耗电15-20%。对于本就紧张的手机续航来说,这是不小的压力。

  2. 开发门槛提高:原来在60Hz环境下勉强能跑的应用,到了120Hz可能就会显得卡顿。每帧只有8.33ms的处理时间,对开发者的代码效率提出了更高要求。

  3. 发热增加:长时间运行高帧率游戏,手机发热明显比60Hz更严重,这不仅影响体验,还可能导致性能降频。

  4. 应用适配并不完善:很多应用并未针对高刷做优化,即使在120Hz屏幕上,实际输出帧率可能还是60fps,浪费了屏幕潜力。

思考与展望

随着 120Hz 高刷新率逐渐成为旗舰手机的标配,一个值得思考的问题是:我们真的需要在所有场景下都保持 120Hz 的刷新率吗?

苹果的 ProMotion 技术给出了一个更为合理的答案:只有在真正需要高感知度的动画场景下才激活高刷新率,而在其他场景则可以适当降低刷新率以节省电量。

iOS Promotion 的动画建议帧率

从上图能看出,苹果在 iOS 开发文档中为不同类型的动画场景提供了非常精细的 ProMotion 帧率推荐配置:

  1. 高影响力动画(High-impact animations)
  • 适用场景:全屏转场(如照片应用中点击缩略图展开)、第一人称游戏、Sheet弹出展示等
  • 推荐帧率:80-120Hz,首选120Hz(CAFrameRateRange(minimum:80, maximum:120, preferred:120))
  • 使用建议:谨慎使用,仅在关键交互场景应用,以减少电量消耗
  1. 透明度/颜色过渡和微小移动
  • 适用场景:开关状态变化、进度指示器旋转、背景模糊效果等
  • 推荐帧率:使用系统默认帧率范围(CAFrameRateRange.default)
  • 使用建议:这类动画不需要过高帧率,视觉效果差异不大
  1. 低速小动画
  • 适用场景:时钟指针移动、缓慢进度条等
  • 推荐帧率:根据动画速度,可选择8-15Hz、15-24Hz或30-48Hz不等
  • 使用建议:低帧率在这些场景下视觉效果已足够好,同时可显著节省电量
  1. 其他所有情况
  • 推荐使用系统默认帧率

这种精细化的帧率管理策略,不仅让系统能够在用户体验和电池寿命之间取得最佳平衡,也为开发者提供了明确的指导。相比于简单粗暴地全局使用 120Hz,这种有针对性的帧率调整方案通常更科学,也更高效。

电量与体验的权衡

测试表明,将刷新率从 120Hz 降至 60Hz 可节省约 10-15% 的电量。智能地控制刷新率,能在保持良好用户体验的同时,显著延长电池续航时间。

120Hz 的主要价值在于提升交互流畅度和响应速度,而非始终保持高刷新率。更智能的做法是根据实际需求动态调整:在用户感知敏感的场景使用高刷新率,在用户感知不敏感的场景降低刷新率

开发者的适配策略

应用开发者应当意识到,并非所有内容都需要以最高帧率渲染。通过 Android 提供的 API(如 Surface.setFrameRate()),可以为不同内容类型指定合适的帧率,配合系统的自适应刷新率机制,共同达到最佳的性能与电量平衡。

总之,未来高刷新率技术的发展方向应该是更加智能、更加精细的自适应调节,而非简单地追求更高的数字。真正的技术进步是在用户无感知的情况下,在体验和能效之间找到最佳平衡点。

结论

回顾过去几年高刷屏幕的发展,我认为120Hz确实是手机交互体验的一次重要跃升。虽然它带来了功耗和开发复杂性等挑战,但好处是比较明确:更流畅的体验、更低的输入延迟、更自然的动画效果。

对于开发者而言,Perfetto这类工具让我们能够看清120Hz下的性能问题,有的放矢地进行优化。虽然从16ms减少到8ms的预算听起来很紧张,但主流处理器已经有足够能力应对这个挑战。只要合理规划UI复杂度、避免主线程阻塞,流畅的120fps体验是完全可以实现的。

从趋势来看,我不认为手机屏幕刷新率会无限攀升。120Hz 可能会在相当长的时间内成为标准,而未来的焦点将更多放在如何智能化地调整刷新率,在不同场景下找到体验和功耗的最佳平衡点。毕竟,真正重要的是实际体验,而不只是刷新率数字。

关于我 && 博客

下面是个人的介绍和相关的链接,期望与同行的各位多多交流,三人行,则必有我师!

  1. 博主个人介绍 :里面有个人的微信和微信群链接。
  2. 本博客内容导航 :个人博客内容的一个导航。
  3. 个人整理和搜集的优秀博客文章 - Android 性能优化必知必会 :欢迎大家自荐和推荐 (微信私聊即可)
  4. Android性能优化知识星球 : 欢迎加入,多谢支持~

一个人可以走的更快 , 一群人可以走的更远

微信扫一扫