120fps —— 每秒 120 帧的帧率,适用于刷新率为 120Hz 的屏幕,每帧占用 8.3 毫秒。根据 Apple WWDC 2023 Session,ProMotion 自动在 24 到 120 Hz 之间切换频率,以平衡流畅度和功耗。8.3 毫秒 —— 这是标准预算的一半,因此需要认真优化渲染。
要点
120fps —— 相对于标准加倍了的帧率,屏幕每秒刷新图像 120 次。每帧的时间预算为 8.33 毫秒 —— 是 60fps 的一半。这意味着 GPU 和 CPU 必须以两倍的速度处理图形,而所有在 60fps 下 16.7 毫秒内运行的算法在 120fps 下只有在效率翻倍的前提下才能满足。
第一款配备 120Hz 屏幕的移动设备是 Razer Phone(2017),采用夏普的 IGZO 面板。苹果在 iPad Pro(2017)中以 ProMotion 的名义引入了 120Hz,而在 iPhone 中 —— 直到 2021 年 iPhone 13 Pro 才实现。在 Android 上,120Hz 从 2020 年开始普及:三星 Galaxy S20、一加 8 Pro、小米 Mi 10。如今 90–120Hz 是旗舰设备的标准,而 LTPO 技术允许动态调整频率。
用户对 120fps 的感知与 60fps 的不同,与其说在于没有卡顿,不如说在于 即时响应的感觉 —— 光标、滚动、动画都以极小的延迟跟随手指。这种感觉通常被描述为「流畅」或「顺滑」的屏幕。使用 120Hz 后,回到 60Hz 在主观上感觉像是变慢了,即使客观上没有丢帧。
120Hz 屏幕 以每秒 120 次的频率物理刷新像素,通过 MIPI DSI/DPI 总线以双倍频率发送信号。每个像素每 8.3 毫秒接收一个新的亮度值。对于 OLED 面板,这意味着每个子像素的 发光时间 缩短了,这就需要更亮的背光来保持相同的图像亮度。
LTPO(Low-Temperature Polycrystalline Oxide,低温多晶氧化物)—— 一种 OLED 显示屏制造技术,结合了 LTPS(高切换速度)和 IGZO(静态低功耗)。LTPO 允许屏幕在 1 到 120 Hz 之间动态切换刷新率,无需额外能耗。在 Always-On Display 模式下,频率降至 1 Hz;滚动时升至 120 Hz。与一直以 120 Hz 运行的屏幕相比,这可以 节省 高达 30% 的能源。
帧时序 —— 帧间间隔的均匀性,是 120fps 下最重要的参数。如果在 60fps 下 2–3 毫秒的帧间差异不可察觉,那么在 120fps 下同样的绝对差异占帧持续时间的 25%,并会被感知为卡顿。为了实现流畅的 120fps,每帧必须在 8.3 毫秒 ±1 毫秒范围内。Xcode Instruments 中的 FrameRate 等工具不仅显示平均 FPS,还显示间隔直方图以评估帧时序。
// iOS — 通过 CADisplayLink 检测 120Hz 屏幕
func checkDisplayRefreshRate() {
let link = CADisplayLink(target: self,
selector: #selector(step))
if let preferredRate = link?.preferredFrameRateRange {
print("最大频率:\( preferredRate.maximum) 赫兹")
}
}
ProMotion —— 苹果为支持高达 120Hz 自适应刷新率的屏幕注册的商标。首次在 iPad Pro 10.5(2017)中亮相,随后出现在 iPhone 13 Pro(2021)和 MacBook Pro(2021)中。ProMotion 不仅仅是 120Hz —— 它是 智能频率管理:系统分析内容类型并切换频率,以达到性能与功耗的最佳平衡。
ProMotion 支持四种模式:24 Hz 用于静态内容和 24fps 视频,30 Hz 用于 30fps 视频,60 Hz 用于 UI 导航,120 Hz 用于滚动和游戏。模式之间的切换发生在一帧之内(8.3 毫秒),用户无感知。开发者可以通过 CADisplayLink 中的 preferredFrameRateRange 影响频率选择,但最终决定由 系统 基于内容分析做出。
苹果从 iOS 15 开始提供用于 ProMotion 的 API。CADisplayLink.preferredFrameRateRange 允许设置偏好的频率范围。UIScene.ActivationConditions 可以在场景切换时影响频率。对于 Metal 渲染,CAMetalLayer.displaySyncEnabled 必须为 true 才能与 ProMotion 同步。如果应用未针对 120fps 进行优化,iOS 会自动将其切换到 60Hz,这可以在 Xcode 的 GPU Report 部分看到。
// iOS — 为游戏模式请求 120fps
let displayLink = CADisplayLink(
target: self,
selector: #selector(gameLoop)
)
if #available(iOS 15.0, *) {
displayLink?.preferredFrameRateRange =
CAFrameRateRange(minimum: 80,
maximum: 120,
preferred: 120)
}
displayLink?.add(to: .current,
forMode: .default)
针对 120fps 的优化 —— 不仅仅是让代码快两倍,而是重新思考渲染架构。在 60fps 下只需 16.7 毫秒的操作现在必须在 8.3 毫秒内完成。这影响到流水线的所有阶段:CPU 准备、GPU 渲染和系统调用。
在 120fps 下,每帧的 draw calls 数量必须比 60fps 少一倍才能保持相同的 GPU 负载。如果在 60fps 下允许 400 次 draw calls,那么在 120fps 下 —— 不超过 200 次。使用 纹理图集、网格合并和 GPU 实例化来减少渲染调用。在 Metal 上使用 Indirect Command Buffers,在 Vulkan 上使用 Secondary Command Buffers 进行并行命令写入。
着色器 —— 另一个关键因素。具有多次纹理采样和数学运算的复杂像素着色器很容易超过 8.3 毫秒的预算。使用低精度着色器(使用 half 而非 float),减少指令条数和纹理采样数。在移动 GPU(Apple A17、Snapdragon 8 Gen 3)上,每次纹理采样需要 2–4 个周期,在 120fps 下这可能成为 瓶颈。
在 120fps 下,主线程必须在 4–5 毫秒内准备好帧,以便为 GPU 渲染留出时间。主线程上的任何同步操作 —— 数据库读取、JSON 解析、图像加载 —— 都会导致卡顿。将所有繁重操作移到后台线程,使用异步 API 和 线程池。在 iOS 中,qualityOfService 为 .userInteractive 的 DispatchQueue 应仅保留给关键渲染代码使用。
| 组件 | 120fps 预算 | 60fps 预算 |
|---|---|---|
| CPU(主线程) | 4 毫秒 | 8 毫秒 |
| GPU 渲染 | 4 毫秒 | 8 毫秒 |
| 合成 | 0.3 毫秒 | 0.7 毫秒 |
| 等待 VSync | 0–2 毫秒 | 0–5 毫秒 |
120fps 与 60fps 的比较 不仅仅是流畅度翻倍。差异因内容类型而异。对于滚动和 UI 动画,120fps 在主观上提供了更「灵敏」的界面。对于游戏,120fps 的优势体现在减少运动模糊和更精确地跟踪快速物体。
功耗 —— 主要的妥协。在相同的屏幕亮度下,120fps 比 60fps 多消耗 30–50% 的电量。这意味着在 4000 mAh 电池上,以 120fps 玩一小时游戏会使电池放电速度加快约 25–30%。LTPO 屏幕通过在静态场景中将频率降至 1Hz 来部分解决这个问题,但在活跃使用(滚动、游戏)时频率保持在 最高。
在 60fps 和 120fps 之间的选择取决于开发者的优先级。对于社交网络、即时通讯和新闻应用,120fps 并没有显著优势 —— 基本交互(阅读、文本输入)不会从超流畅中受益。对于游戏、地图、图形编辑器和具有密集动画的应用,120fps 成为竞争优势和质量标志。
测试 120fps 需要特殊方法:标准的 60fps 指标无法显示 120Hz 下的帧时序问题。使用高速摄像机(120+ fps)记录屏幕的实际行为,或使用平台内置工具 —— iOS 的 Xcode Metal Capture 和 Android 的 AGI(Android GPU Inspector)。这些工具显示每帧的精确时间(包括 VSync 等待),并帮助检测微卡顿。
常见问题
并非总是如此。120fps 需要两倍的能量和计算资源。对于静态内容和简单 UI,60fps 已经足够。120fps 的优势在动态场景中明显:滚动、游戏、过渡动画。
使用 Xcode Instruments(Core Animation 模板)或 Android Studio Profiler。在 iOS 中,检查 CADisplayLink.timestamp —— 调用之间的间隔应约为 8.3 毫秒。在 Android 中,在 Developer Options 中启用 Show refresh rate。
屏幕刷新像素的频率翻倍,GPU 执行两倍的渲染操作,CPU 处理两倍的帧数。每次操作都会消耗能量。LTPO 屏幕在静态状态下降低频率,但在活跃使用时 功耗 随频率成比例上升。
可以。从 Android 11 开始,系统支持不同的刷新率。开发者可以通过 WindowManager.setPreferredRefreshRate 请求 120Hz。但并非所有设备都能稳定维持 120fps —— 需要优化 GPU 渲染。
在盲测中,大多数用户在滚动和动画中 能注意到 区别。但日常使用(社交媒体、视频、聊天工具)中,差异主观上很小。习惯了 120Hz 后,回到 60Hz 会感觉变慢了。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。