鸿蒙 7.0 LTPO 可变帧率:ExpectedFrameRateRange 范帧率——性能功耗平衡根因
本文是「鸿蒙 7.0 新特性」系列第 11 篇。上篇讲鸿蒙分布式数据盾(DDO 跨端数据对象 + DID 数字身份,可信同步)。本文讲鸿蒙 LTPO 可变帧率核心:ExpectedFrameRateRange 范帧率——根因在性能功耗平衡引擎。鸿蒙 7.0(API 26)LTPO 可变帧率三层架构(Animator.setExpectedFrameRateRange 属性动画帧率 + UIContext.setFrameRateRange Swiper DynamicSyncScene 帧率 + DisplaySync 独立绘制帧率,硬件级 1-120Hz 自适应刷新率),本文用本机 API 21 就能跑的
@ohos.graphics.displaySync的DisplaySync(独立绘制帧率,API 12)+setExpectedFrameRateRange(设期望帧率范围 expected/min/max,API 12)+on('frame')(帧回调,API 12)真机演示,再讲鸿蒙 7.0 LTPO 可变帧率演进根因:Animator.setExpectedFrameRateRange(API 12)→ UIContext.setFrameRateRange(API 12)→ DisplaySync 独立绘制帧率(API 12)→ LTPO 硬件级 1-120Hz 自适应刷新率(API 26,低温多晶氧化物)。
一、开篇:可变帧率不是「固定 60Hz 刷新」,是「性能功耗平衡引擎」
你写 React 时,帧率是「固定 60Hz 刷新魔法」(requestAnimationFrame 永远 60Hz,不管场景):
// React 帧率:固定 60Hz 刷新魔法(requestAnimationFrame 永远 60Hz)
function SpinAnimation() {
const animate = () => {
// ❌ requestAnimationFrame 永远 60Hz,转盘微动效也跑 60Hz(浪功耗)
requestAnimationFrame(animate)
// ❌ 无场景帧率建议,小区域动效和高帧率场景一样跑 60Hz
}
useEffect(() => {
animate()
}, [])
// React 帧率:固定 60Hz 刷新魔法(requestAnimationFrame 永远 60Hz,无场景帧率建议)
}
你写鸿蒙 ArkTS 时,可变帧率是性能功耗平衡引擎——DisplaySync 独立绘制帧率 + ExpectedFrameRateRange 范帧率:
// ArkTS 可变帧率:性能功耗平衡引擎,DisplaySync + ExpectedFrameRateRange
import displaySync from '@ohos.graphics.displaySync'
interface FrameRateRange {
expected: number // ✅ 期望帧率(系统优先按 expected 执行)
min: number // ✅ 最小帧率
max: number // ✅ 最大帧率
}
@Entry
@Component
struct Index {
private displaySync: displaySync.DisplaySync | null = null
aboutToAppear() {
// ✅ displaySync.create() 造 DisplaySync 实例(API 12,独立绘制帧率,不干扰系统可变帧率机制)
this.displaySync = displaySync.create()
// ✅ on('frame') 监听帧回调(每帧回调一次,系统按 expected 帧率回调)
this.displaySync.on('frame', (info: displaySync.IntervalInfo) => {
// ✅ 帧回调里做绘制逻辑(转盘微动效设 15Hz,弹幕动效设 60Hz,转场动效设 120Hz)
})
}
setupFrameRate() {
// ✅ ExpectedFrameRateRange:expected 期望帧率 + min/max 范围(系统难满足 expected 时在 min/max 间选)
// ⚠ 不建议 expected/min/max 全设 120(干扰系统可变帧率机制,增加负载,影响功耗)
const range: FrameRateRange = { expected: 15, min: 10, max: 30 } // ✅ 转盘微动效 15Hz(降功耗)
this.displaySync?.setExpectedFrameRateRange(range as object as ExpectedFrameRateRange)
this.displaySync?.start() // ✅ start 启帧回调(系统按 15Hz 回调)
}
}
// ArkTS 可变帧率:性能功耗平衡引擎,DisplaySync + ExpectedFrameRateRange
固定 60Hz 刷新魔法 vs 性能功耗平衡引擎的区别:React 把帧率当固定 60Hz 刷新魔法(requestAnimationFrame 永远 60Hz,无场景帧率建议,小区域动效和高帧率场景一样跑 60Hz浪功耗),ArkTS 把可变帧率当「性能功耗平衡引擎」(DisplaySync 独立绘制帧率 + ExpectedFrameRateRange 范帧率,转盘微动效 15Hz/弹幕 60Hz/转场 120Hz 按场景调)。根因不是固定 60Hz 刷新是性能功耗平衡引擎——ExpectedFrameRateRange 范帧率,性能功耗平衡引擎。
二、根因:鸿蒙 LTPO 可变帧率的性能功耗平衡三层架构机制
鸿蒙 7.0 LTPO 可变帧率是性能功耗平衡三层架构绑定——Animator 动画帧率 + UIContext UI 帧率 + DisplaySync 独立绘制帧率,来自三重绑定机制。
机制 1:Animator.setExpectedFrameRateRange——属性动画/显式动画的帧率属性参数
Animator.setExpectedFrameRateRange——属性动画/显式动画的帧率属性参数,动画绘制按场景调帧率:
// ✅ Animator.setExpectedFrameRateRange(API 12,属性动画/显式动画的帧率属性参数)
import animator from '@ohos.animator'
// ✅ 造 Animator 实例(API 6,属性动画)
const anim = animator.create Animator()
// ✅ setExpectedFrameRateRange 设动画帧率范围(API 12)
// ✅ 转场动效设 120Hz(高帧率场景,全屏非持续动效)
anim.setExpectedFrameRateRange({
expected: 120, // ✅ 期望帧率 120Hz(系统优先执行)
min: 90, // ✅ 最小 90Hz
max: 120, // ✅ 最大 120Hz
} as ExpectedFrameRateRange)
// ✅ 动画绘制按 120Hz 帧率执行(转场动效流畅,非持续不发热)
// Animator.setExpectedFrameRateRange:属性动画/显式动画的帧率属性参数
Animator.setExpectedFrameRateRange vs requestAnimationFrame 固定 60Hz 的区别:Animator.setExpectedFrameRateRange(动画帧率范围 expected/min/max,按场景调 120Hz 转场/15Hz 转盘,API 12),requestAnimationFrame(固定 60Hz,无场景建议,转盘也跑 60Hz 浪功耗)。根因不是 requestAnimationFrame 固定 60Hz 是 Animator.setExpectedFrameRateRange——动画帧率范围按场景调,性能功耗平衡。
机制 2:UIContext.setFrameRateRange——Swiper DynamicSyncScene 帧率范围
UIContext.setFrameRateRange——Swiper DynamicSyncScene 帧率范围,UI 组件按场景调帧率:
// ✅ UIContext.setFrameRateRange(API 12,Swiper DynamicSyncScene 帧率范围)
// ✅ getUIContext() 拿 UIContext
const uiContext = this.getUIContext()
// ✅ setFrameRateRange 设 Swiper DynamicSyncScene 帧率范围
// ✅ 弹幕动效设 60Hz(中等帧率场景,变化区域大的持续型动效)
uiContext.setFrameRateRange({
expected: 60, // ✅ 期望帧率 60Hz
min: 30, // ✅ 最小 30Hz
max: 90, // ✅ 最大 90Hz
} as ExpectedFrameRateRange)
// ✅ getFrameRateRange() 拿当前帧率范围
const range = uiContext.getFrameRateRange()
// UIContext.setFrameRateRange:Swiper DynamicSyncScene 帧率范围,UI 组件按场景调
UIContext.setFrameRateRange vs React CSS animation 固定帧率的区别:UIContext.setFrameRateRange(Swiper DynamicSyncScene 帧率范围 expected/min/max,API 12),React CSS animation(固定帧率,无范围建议)。根因不是 React CSS animation 固定帧率是 UIContext.setFrameRateRange——Swiper DynamicSyncScene 帧率范围,UI 组件按场景调。
机制 3:DisplaySync 独立绘制帧率——UI 绘制/XComponent 自绘制/NativeVsync 非 UI 线程
DisplaySync 独立绘制帧率——UI 绘制/XComponent 自绘制内容/NativeVsync 非 UI 线程绘制,独立帧率不干扰系统:
// ✅ DisplaySync 独立绘制帧率(API 12,@ohos.graphics.displaySync)
import displaySync from '@ohos.graphics.displaySync'
// ✅ displaySync.create() 造 DisplaySync 实例(API 12,独立绘制帧率,不干扰系统可变帧率机制)
const ds = displaySync.create()
// ✅ on('frame') 监听帧回调(IntervalInfo 含 timestamp,每帧回调一次)
ds.on('frame', (info: displaySync.IntervalInfo) => {
// ✅ 帧回调里做绘制逻辑(系统按 ExpectedFrameRateRange.expected 帧率回调)
console.info(`frame timestamp=${info.timestamp}`)
})
// ✅ setExpectedFrameRateRange 设独立绘制帧率范围(用于 UI 绘制/XComponent 自绘制/NativeVsync)
// ✅ 转盘微动效设 15Hz(低帧率场景,小区域动效/微动效,降功耗)
ds.setExpectedFrameRateRange({
expected: 15, // ✅ 期望帧率 15Hz(转盘微动效,降功耗)
min: 10, // ✅ 最小 10Hz
max: 30, // ✅ 最大 30Hz
} as ExpectedFrameRateRange)
// ✅ start() 启帧回调(系统按 expected=15Hz 帧率回调)/ stop() 停帧回调
ds.start() // ✅ 启帧回调
ds.stop() // ✅ 停帧回调
ds.off('frame') // ✅ 摘监听(销毁时调用)
// DisplaySync 独立绘制帧率:UI 绘制/XComponent 自绘制/NativeVsync 非 UI 线程,不干扰系统可变帧率
DisplaySync vs requestAnimationFrame 的区别:DisplaySync(独立绘制帧率,ExpectedFrameRateRange expected/min/max 按场景调,不干扰系统可变帧率机制,API 12),requestAnimationFrame(固定 60Hz,干扰系统可变帧率,无场景建议)。根因不是 requestAnimationFrame 是 DisplaySync——独立绘制帧率按场景调,不干扰系统可变帧率机制。
三、真机配图:鸿蒙 LTPO 可变帧率——ExpectedFrameRateRange 范帧率




真机配图展示鸿蒙 LTPO 可变帧率 ExpectedFrameRateRange 范帧率:
- 初始态:鸿蒙 7.0 LTPO 可变帧率标题,四个场景卡片——场景1 造 DisplaySync 独立绘制帧率(displaySync.create)、场景2 设 ExpectedFrameRateRange 期望帧率范围(高帧率 90-120Hz/中等 60Hz/低帧率 15-30Hz 三档按钮)、场景3 启/停 DisplaySync 帧回调(start/stop)、场景4 鸿蒙 7.0 LTPO 四场景帧率建议,下方三层演进说明
- 造 DisplaySync 态:点击「① 造 DisplaySync」按钮,frameStatus 显示「DisplaySync 已造 + on(“frame”) 监听已挂(帧回调计数中)」,日志显示「✅ displaySync.create() + on(“frame”) 成功:造独立绘制帧率实例(API 12,不干扰系统可变帧率)」——造 DisplaySync 验证
- 设 60Hz 态:点击「④ 60Hz」按钮,frameStatus 显示「✅ setExpectedFrameRateRange({expected=60, min=30, max=90}) 成功」,当前帧率显示「expected=60 / min=30 / max=90」——设帧率范围验证
- LTPO 四场景态:点击「⑨ 演示 LTPO 四场景」按钮,sceneStatus 显示「✅ 鸿蒙 7.0 LTPO 四场景:高帧率 90-120Hz(启动/转场)/ 中等 60Hz(弹幕/翻页)/ 低帧率 15-30Hz(转盘/转圈)/ 跟随源帧率」,pipelineStatus 显示「✅ LTPO 硬件级 1-120Hz 自适应刷新率(API 26):按需调整显示刷新率,性能体验与功耗平衡」——LTPO 四场景验证
四、真解法:鸿蒙 LTPO 可变帧率的三个场景
场景 1:造 DisplaySync 独立绘制帧率(displaySync.create + on(‘frame’))——90% 场景首选
造 DisplaySync 独立绘制帧率用 @ohos.graphics.displaySync + create() + on('frame'):
// ✅ 场景 1:造 DisplaySync 独立绘制帧率(API 12,displaySync.create + on('frame'))
import displaySync from '@ohos.graphics.displaySync'
@Entry
@Component
struct Index {
private displaySync: displaySync.DisplaySync | null = null
createDisplaySync() {
// ✅ displaySync.create() 造 DisplaySync 实例(API 12,独立绘制帧率,不干扰系统可变帧率机制)
this.displaySync = displaySync.create()
// ✅ on('frame') 监听帧回调(IntervalInfo 含 timestamp,每帧回调一次)
this.displaySync.on('frame', (info: displaySync.IntervalInfo) => {
// ✅ 帧回调里做绘制逻辑(系统按 ExpectedFrameRateRange.expected 帧率回调)
console.info(`frame timestamp=${info.timestamp}`)
})
}
// ✅ 销毁(页面退出时调用)
destroyDisplaySync() {
if (!this.displaySync) return
// ✅ off('frame') 摘监听 + stop() 停帧回调
this.displaySync.off('frame')
this.displaySync.stop()
this.displaySync = null
}
}
// 造 DisplaySync 独立绘制帧率:90% 场景首选,不干扰系统可变帧率机制
鸿蒙 DisplaySync API 真名坑:displaySync.create() 返回 DisplaySync 实例(API 12,无参);on('frame', callback) 监听帧回调(回调参 IntervalInfo,含 timestamp 字段);off('frame') 摘监听(销毁时必调用);start() 启帧回调 + stop() 停帧回调(启停配对,不启不回调);DisplaySync 用于 UI 绘制/XComponent 自绘制内容/NativeVsync 非 UI 线程绘制。
场景 2:设 ExpectedFrameRateRange 期望帧率范围(expected/min/max 三字段)
设 ExpectedFrameRateRange 期望帧率范围用 setExpectedFrameRateRange + expected/min/max:
// ✅ 场景 2:设 ExpectedFrameRateRange 期望帧率范围(API 12,expected/min/max)
import displaySync from '@ohos.graphics.displaySync'
interface FrameRateRange {
expected: number // ✅ 期望帧率(系统优先按 expected 执行,难满足时在 min/max 间选合适帧率)
min: number // ✅ 最小帧率
max: number // ✅ 最大帧率
}
setFrameRateRange(expected: number, min: number, max: number, label: string) {
if (!this.displaySync) return
// ✅ ExpectedFrameRateRange:expected 期望帧率(系统优先)+ min/max 范围(难满足时选合适帧率)
// ⚠ ExpectedFrameRateRange 需显式 interface 声明(ArkTS 不允许未类型化对象字面量)
// ⚠ 需 `as object as ExpectedFrameRateRange` 双重强转(FrameRateRange → object → ExpectedFrameRateRange)
const range: FrameRateRange = { expected: expected, min: min, max: max }
this.displaySync.setExpectedFrameRateRange(range as object as ExpectedFrameRateRange)
}
// ✅ 鸿蒙 7.0 LTPO 四场景帧率建议(按场景调帧率,性能功耗平衡)
// ✅ 高帧率场景(90-120Hz):应用启动/退出,窗口转场动效,拖动窗口移动动效(全屏非持续动效)
this.setFrameRateRange(120, 90, 120, '高帧率 120Hz 转场动效')
// ✅ 中等帧率场景(60Hz):视频内弹幕,小说自动翻页,消息滑动动效(变化区域大的持续型动效)
this.setFrameRateRange(60, 30, 90, '中等帧率 60Hz 弹幕动效')
// ✅ 低帧率场景(15-30Hz):转盘动效,页面刷新转圈,滚动条消失动效(小区域动效/微动效)
this.setFrameRateRange(15, 10, 30, '低帧率 15Hz 转盘微动效')
// 设 ExpectedFrameRateRange:expected/min/max 按场景调,性能功耗平衡
鸿蒙 ExpectedFrameRateRange API 真名坑:ExpectedFrameRateRange 含三字段 expected/min/max(全 number 类型);expected 是期望帧率(系统优先按 expected 执行,难满足时在 min/max 间选合适帧率);不建议 expected/min/max 全设 120(干扰系统可变帧率机制,增加负载,影响整机性能和功耗,长时 120Hz 导致手机过热);ArkTS 不允许未类型化对象字面量,需显式 interface FrameRateRange 声明 + as object as ExpectedFrameRateRange 双重强转。
场景 3:鸿蒙 7.0 LTPO 四场景帧率建议(API 26,硬件级 1-120Hz 自适应刷新率)
鸿蒙 7.0(API 26)LTPO 四场景帧率建议——高帧率/中等/低帧率/跟随源帧率,硬件级自适应刷新率:
// ✅ 场景 3:鸿蒙 7.0 LTPO 四场景帧率建议(API 26,硬件级 1-120Hz 自适应刷新率)
// ✅ LTPO(Low Temperature Polycrystalline Oxide,低温多晶氧化物):OLED 屏背板驱动技术
// ✅ LTPO 屏支持 1-120Hz 自适应刷新率(按需调整显示刷新率,性能体验与功耗平衡)
// ✅ 高帧率场景(90-120Hz):应用启动/退出,窗口转场动效,拖动窗口移动动效
// ✅ 全屏非持续动效,高帧率流畅,非持续不发热
this.setFrameRateRange(120, 90, 120, '高帧率 120Hz 转场动效')
// ✅ 中等帧率场景(60Hz):视频内弹幕,小说自动翻页,消息滑动动效
// ✅ 变化区域大的持续型动效,60Hz 平衡流畅与功耗
this.setFrameRateRange(60, 30, 90, '中等帧率 60Hz 弹幕动效')
// ✅ 低帧率场景(15-30Hz):转盘动效,页面刷新转圈,滚动条消失动效
// ✅ 小区域动效/微动效,15-30Hz 降功耗,不卡顿
this.setFrameRateRange(15, 10, 30, '低帧率 15Hz 转盘微动效')
// ✅ 跟随源帧率场景:插画动效,固定源帧率动效(帧率跟随内容源,不长时高帧率)
// ✅ 购物应用首页图标帧动效,聊天表情包动效,导航主界面
// 鸿蒙 7.0 LTPO 四场景帧率建议:精细化场景帧率控制,降负载减卡顿降功耗
鸿蒙 7.0 LTPO vs 固定 60Hz 刷新的区别:鸿蒙 7.0 LTPO(硬件级 1-120Hz 自适应刷新率,按需调整显示刷新率,性能体验与功耗平衡,API 26),固定 60Hz 刷新(无自适应,转盘微动效也跑 60Hz 浪功耗)。根因不是固定 60Hz 刷新是鸿蒙 7.0 LTPO——硬件级 1-120Hz 自适应刷新率,精细化场景帧率控制,性能功耗平衡。
五、一句话哲学
写鸿蒙 ArkUI 记住:可变帧率不是「固定 60Hz 刷新」是「性能功耗平衡引擎」——鸿蒙 7.0 LTPO 可变帧率性能功耗平衡三层架构。根因不是固定 60Hz 刷新是性能功耗平衡引擎——Animator.setExpectedFrameRateRange(属性动画/显式动画的帧率属性参数,API 12)+ UIContext.setFrameRateRange(Swiper DynamicSyncScene 帧率范围,API 12,getFrameRateRange 拿当前范围)+ DisplaySync 独立绘制帧率(@ohos.graphics.displaySync,displaySync.create 造实例,setExpectedFrameRateRange 设独立绘制帧率,on(‘frame’) 帧回调 IntervalInfo 含 timestamp,start/stop 启停帧回调,用于 UI 绘制/XComponent 自绘制/NativeVsync 非 UI 线程,不干扰系统可变帧率机制,API 12)+ LTPO 硬件级 1-120Hz 自适应刷新率(低温多晶氧化物,OLED 屏背板驱动技术,按需调整显示刷新率,性能体验与功耗平衡,API 26)。ExpectedFrameRateRange 三字段 expected 期望帧率(系统优先按 expected 执行,难满足时在 min/max 间选合适帧率)/ min 最小帧率 / max 最大帧率(不建议全设 120 干扰系统可变帧率机制增加负载影响功耗长时 120Hz 导致手机过热)。鸿蒙 7.0 LTPO 四场景帧率建议:高帧率 90-120Hz(应用启动/退出/窗口转场/拖动窗口移动,全屏非持续动效)/ 中等帧率 60Hz(视频内弹幕/小说自动翻页/消息滑动,变化区域大的持续型动效)/ 低帧率 15-30Hz(转盘动效/页面刷新转圈/滚动条消失,小区域动效/微动效)/ 跟随源帧率(插画动效/固定源帧率动效,帧率跟随内容源不长时高帧率)。造 DisplaySync 用 displaySync.create()(API 12 无参,DisplaySync 实例),设帧率用 setExpectedFrameRateRange(ExpectedFrameRateRange 需显式 interface 声明 ArkTS 不允许未类型化对象字面量,as object as ExpectedFrameRateRange 双重强转),帧回调用 on(‘frame’)(回调参 IntervalInfo 含 timestamp),启停用 start()/stop()(启停配对不启不回调),销毁用 off(‘frame’)+stop()。性能功耗平衡引擎精细化场景帧率控制是鸿蒙 7.0 LTPO 可变帧率核心!
能力系列回链
- 鸿蒙 7.0 新特性篇 1「沉浸式毛玻璃 + 底部 Sheet 面板」——backgroundBlurStyle 系统材质渲染槽
- 鸿蒙 7.0 新特性篇 2「Component3D 空间计算」——一行加载 glTF 3D 模型真机渲染
- 鸿蒙 7.0 新特性篇 3「鸿蒙智能体框架 2.0」——意图即服务,InsightIntentExecutor 意图路由表
- 鸿蒙 7.0 新特性篇 4「超丝滑方舟引擎」——springMotion 物理弹簧动画,真实回弹手感
- 鸿蒙 7.0 新特性篇 5「鸿蒙星盾安全」——关键资产隔离 + 权限最小化,零信任安全
- 鸿蒙 7.0 新特性篇 6「鸿蒙星河互联」——分布式设备发现 + 跨设备拖放,碰一碰精准分享
- 鸿蒙 7.0 新特性篇 7「鸿蒙空间音频引擎」——AudioSpatializationManager 空间渲染,立体声场
- 鸿蒙 7.0 新特性篇 8「鸿蒙可变字体」——fontFeature + fontVariations,一文件多形态
- 鸿蒙 7.0 新特性篇 9「鸿蒙游戏快启」——launchAcceleration 预启动 + 冷启预建链,秒开
- 鸿蒙 7.0 新特性篇 10「鸿蒙分布式数据盾」——DDO 跨端数据对象 + DID 数字身份,可信同步
- 鸿蒙 7.0 新特性篇 11「鸿蒙 LTPO 可变帧率」——ExpectedFrameRateRange 范帧率,性能功耗平衡(本文)
真机 demo 完整代码
// 鸿蒙 7.0 新特性篇 11:LTPO 可变帧率——ExpectedFrameRateRange 范帧率根因
// 本 demo 用 API 12+ @ohos.graphics.displaySync 的 DisplaySync + ExpectedFrameRateRange 真机演示(本机 API 21 可跑)
// 文章里讲鸿蒙 7.0 LTPO 可变帧率演进:Animator.setExpectedFrameRateRange(API 12)→ UIContext.setFrameRateRange(API 12)→ DisplaySync 独立绘制帧率(API 12)→ LTPO 1-120Hz 自适应刷新率(API 26)
import displaySync from '@ohos.graphics.displaySync'
// ✅ ExpectedFrameRateRange 字段需显式 interface 声明(ArkTS 不允许未类型化对象字面量)
interface FrameRateRange {
expected: number // ✅ 期望帧率(系统优先按 expected 执行,难满足时在 min/max 间选合适帧率)
min: number // ✅ 最小帧率
max: number // ✅ 最大帧率
}
@Entry
@Component
struct Index {
@State log: string = '(未操作)'
@State currentExpected: number = 60
@State currentMin: number = 30
@State currentMax: number = 120
@State frameCount: number = 0
@State frameStatus: string = '(未启)'
@State sceneStatus: string = '(未选场景)'
@State pipelineStatus: string = '(未演示)'
private displaySync: displaySync.DisplaySync | null = null
aboutToAppear() {
this.log = '鸿蒙 7.0 LTPO 可变帧率:ExpectedFrameRateRange 范帧率'
}
// ✅ 场景 1:造 DisplaySync 独立绘制帧率(API 12,用于 UI 绘制 / 自绘制内容)
createDisplaySync() {
// ✅ displaySync.create() 造 DisplaySync 实例(API 12,独立绘制帧率,不干扰系统可变帧率机制)
this.displaySync = displaySync.create()
// ✅ on('frame') 监听帧回调(IntervalInfo 含 timestamp,每帧回调一次)
this.displaySync.on('frame', (info: displaySync.IntervalInfo) => {
this.frameCount = this.frameCount + 1
// ✅ 帧回调里做绘制逻辑(系统按 ExpectedFrameRateRange.expected 帧率回调)
})
this.frameStatus = 'DisplaySync 已造 + on("frame") 监听已挂(帧回调计数中)'
this.log = '✅ displaySync.create() + on("frame") 成功:造独立绘制帧率实例(API 12,不干扰系统可变帧率)'
}
// ✅ 场景 2:设 ExpectedFrameRateRange 期望帧率范围(expected/min/max 三字段)
setFrameRateRange(expected: number, min: number, max: number, label: string) {
if (!this.displaySync) {
this.log = '❌ 先造 DisplaySync(场景1)再设帧率范围'
return
}
// ✅ ExpectedFrameRateRange:expected 期望帧率(系统优先执行)+ min/max 范围
// ⚠ 不建议 expected/min/max 全设 120(干扰系统可变帧率机制,增加负载,影响功耗)
const range: FrameRateRange = { expected: expected, min: min, max: max }
this.displaySync.setExpectedFrameRateRange(range as object as ExpectedFrameRateRange)
this.currentExpected = expected
this.currentMin = min
this.currentMax = max
this.frameStatus = `✅ setExpectedFrameRateRange({expected=${expected}, min=${min}, max=${max}}) 成功`
this.log = `✅ 设帧率范围 ${label}:expected=${expected}(系统优先)/ min=${min} / max=${max}(API 12)`
}
// ✅ 场景 3:启/停 DisplaySync 帧回调(start/stop,API 12)
startFrameSync() {
if (!this.displaySync) {
this.log = '❌ 先造 DisplaySync(场景1)再启帧同步'
return
}
// ✅ start() 启帧回调(系统按 expected 帧率回调 on('frame'))
this.displaySync.start()
this.frameStatus = `✅ start() 已启:系统按 expected=${this.currentExpected}Hz 帧率回调(帧计数=${this.frameCount})`
this.log = `✅ DisplaySync.start() 成功:启帧回调,系统按 expected=${this.currentExpected}Hz 帧率回调(API 12)`
}
stopFrameSync() {
if (!this.displaySync) {
this.log = '❌ 先造 DisplaySync(场景1)再停帧同步'
return
}
// ✅ stop() 停帧回调(停止 on('frame') 回调)
this.displaySync.stop()
this.frameStatus = `✅ stop() 已停:帧回调停止(总帧数=${this.frameCount})`
this.log = `✅ DisplaySync.stop() 成功:停帧回调,总帧数=${this.frameCount}(API 12)`
}
// ✅ 场景 4:鸿蒙 7.0 LTPO 四场景帧率建议(API 26,硬件级 1-120Hz 自适应刷新率)
demonstrateLTPoScenes() {
this.sceneStatus = '✅ 鸿蒙 7.0 LTPO 四场景:高帧率 90-120Hz(启动/转场)/ 中等 60Hz(弹幕/翻页)/ 低帧率 15-30Hz(转盘/转圈)/ 跟随源帧率'
this.pipelineStatus = '✅ LTPO 硬件级 1-120Hz 自适应刷新率(API 26):按需调整显示刷新率,性能体验与功耗平衡'
this.log = '✅ 鸿蒙 7.0 LTPO 四场景帧率建议(API 26):精细化场景帧率控制,降负载减卡顿降功耗'
}
// ✅ 销毁(页面退出时调用)
destroyDisplaySync() {
if (!this.displaySync) {
this.log = '❌ DisplaySync 未造'
return
}
// ✅ off('frame') 摘监听 + stop() 停帧回调
this.displaySync.off('frame')
this.displaySync.stop()
this.displaySync = null
this.log = '✅ DisplaySync 已销毁:off("frame") 摘监听 + stop() 停帧回调(API 12)'
this.frameStatus = '(已销毁)'
this.frameCount = 0
}
build() {
Column({ space: 8 }) {
Text('鸿蒙 7.0 LTPO 可变帧率')
.fontSize(18).fontWeight(FontWeight.Bold).margin({ top: 16, bottom: 4 })
Text('ExpectedFrameRateRange 范帧率——性能功耗平衡根因')
.fontSize(11).fontColor('#888').margin({ bottom: 8 })
// ✅ 场景 1:造 DisplaySync 独立绘制帧率(API 12)
Column({ space: 6 }) {
Text('场景 1:造 DisplaySync 独立绘制帧率(API 12,displaySync.create)')
.fontSize(12).fontColor('#2563eb').fontWeight(FontWeight.Bold)
Text('独立绘制帧率用于 UI 绘制/自绘制内容,不干扰系统可变帧率机制')
.fontSize(9).fontColor('#888')
Row({ space: 6 }) {
Button('① 造 DisplaySync').height(28).fontSize(9).backgroundColor('#2563eb20')
.onClick(() => this.createDisplaySync())
Button('⑧ 销毁').height(28).fontSize(9).backgroundColor('#dc354520')
.onClick(() => this.destroyDisplaySync())
}
Text(this.frameStatus).fontSize(9).fontColor('#28a745').margin({ top: 4 })
Text(`帧计数:${this.frameCount}`).fontSize(9).fontColor('#ff6600').margin({ top: 2 })
}
.width('92%').padding(8).backgroundColor('#e0f0ff').borderRadius(8)
// ✅ 场景 2:设 ExpectedFrameRateRange 期望帧率范围(expected/min/max)
Column({ space: 6 }) {
Text('场景 2:设 ExpectedFrameRateRange 期望帧率范围(API 12)')
.fontSize(12).fontColor('#ff6600').fontWeight(FontWeight.Bold)
Text('expected 期望帧率(系统优先)/ min-max 范围(难满足时选合适帧率)')
.fontSize(9).fontColor('#888')
Text('高帧率场景(90-120Hz,启动/转场动效)')
.fontSize(9).fontColor('#dc3545').fontWeight(FontWeight.Bold).margin({ top: 4 })
Row({ space: 6 }) {
Button('② 90Hz').height(26).fontSize(8).backgroundColor('#dc354520')
.onClick(() => this.setFrameRateRange(90, 60, 120, '高帧率 90Hz'))
Button('③ 120Hz').height(26).fontSize(8).backgroundColor('#dc354520')
.onClick(() => this.setFrameRateRange(120, 90, 120, '高帧率 120Hz(不建议长时,发热)'))
}
Text('中等帧率场景(60Hz,弹幕/翻页动效)')
.fontSize(9).fontColor('#ff6600').fontWeight(FontWeight.Bold).margin({ top: 4 })
Row({ space: 6 }) {
Button('④ 60Hz').height(26).fontSize(8).backgroundColor('#ff660020')
.onClick(() => this.setFrameRateRange(60, 30, 90, '中等帧率 60Hz'))
}
Text('低帧率场景(15-30Hz,转盘/转圈微动效)')
.fontSize(9).fontColor('#28a745').fontWeight(FontWeight.Bold).margin({ top: 4 })
Row({ space: 6 }) {
Button('⑤ 15Hz').height(26).fontSize(8).backgroundColor('#28a74520')
.onClick(() => this.setFrameRateRange(15, 10, 30, '低帧率 15Hz'))
Button('⑥ 30Hz').height(26).fontSize(8).backgroundColor('#28a74520')
.onClick(() => this.setFrameRateRange(30, 15, 60, '低帧率 30Hz'))
}
Text(`当前帧率:expected=${this.currentExpected} / min=${this.currentMin} / max=${this.currentMax}`)
.fontSize(9).fontColor('#333').margin({ top: 4 })
}
.width('92%').padding(8).backgroundColor('#fff3e0').borderRadius(8)
// ✅ 场景 3:启/停 DisplaySync 帧回调(start/stop)
Column({ space: 6 }) {
Text('场景 3:启/停 DisplaySync 帧回调(API 12,start/stop)')
.fontSize(12).fontColor('#28a745').fontWeight(FontWeight.Bold)
Text('start 启帧回调(按 expected 帧率)/ stop 停帧回调')
.fontSize(9).fontColor('#888')
Row({ space: 6 }) {
Button('⑦ start 启帧同步').height(28).fontSize(9).backgroundColor('#28a74520')
.onClick(() => this.startFrameSync())
Button('⑧ stop 停').height(28).fontSize(9).backgroundColor('#6c757d20')
.onClick(() => this.stopFrameSync())
}
Text(this.frameStatus).fontSize(9).fontColor('#28a745').margin({ top: 4 })
}
.width('92%').padding(8).backgroundColor('#d4edda').borderRadius(8)
// ✅ 场景 4:鸿蒙 7.0 LTPO 四场景帧率建议(API 26,硬件级 1-120Hz 自适应刷新率)
Column({ space: 6 }) {
Text('场景 4:鸿蒙 7.0 LTPO 四场景帧率建议(API 26,硬件级自适应刷新率)')
.fontSize(12).fontColor('#dc3545').fontWeight(FontWeight.Bold)
Text('LTPO 1-120Hz 自适应刷新率:按需调整显示刷新率,性能体验与功耗平衡')
.fontSize(9).fontColor('#888')
Button('⑨ 演示 LTPO 四场景').height(30).fontSize(9).backgroundColor('#dc354520')
.onClick(() => this.demonstrateLTPoScenes())
Text(this.sceneStatus).fontSize(9).fontColor('#dc3545').margin({ top: 4 })
Text(this.pipelineStatus).fontSize(9).fontColor('#ff6600').margin({ top: 2 })
}
.width('92%').padding(8).backgroundColor('#f8d7da').borderRadius(8)
// ✅ 鸿蒙 7.0 LTPO 可变帧率三层演进说明
Column({ space: 3 }) {
Text('鸿蒙 7.0 LTPO 可变帧率三层演进')
.fontSize(10).fontColor('#6c757d').fontWeight(FontWeight.Bold)
Text('① Animator.setExpectedFrameRateRange(API 12):属性动画/显式动画的帧率属性参数')
.fontSize(8).fontColor('#888')
Text('② UIContext.setFrameRateRange(API 12):Swiper DynamicSyncScene 帧率范围')
.fontSize(8).fontColor('#888')
Text('③ DisplaySync 独立绘制帧率(API 12):UI 绘制/XComponent 自绘制/NativeVsync 非 UI 线程')
.fontSize(8).fontColor('#28a745')
Text('④ LTPO 硬件级 1-120Hz 自适应刷新率(API 26):低温多晶氧化物,按需调整显示刷新率')
.fontSize(8).fontColor('#dc3545')
Text('⚠ 不建议 expected/min/max 全设 120(干扰系统可变帧率机制,增加负载,影响功耗)')
.fontSize(8).fontColor('#ff6600')
}
.width('92%').padding(6).backgroundColor('#f8f9fa').borderRadius(8)
Text(`日志:${this.log}`).fontSize(9).fontColor('#333').margin({ top: 6 })
Text('鸿蒙 7.0(API 26)LTPO:1-120Hz 自适应刷新率,精细化场景帧率控制,性能体验与功耗平衡')
.fontSize(8).fontColor('#dc3545').margin({ top: 6 })
}
.width('100%').height('100%').alignItems(HorizontalAlign.Center)
}
}
写鸿蒙 ArkUI 记住:可变帧率不是「固定 60Hz 刷新」是「性能功耗平衡引擎」——鸿蒙 7.0 LTPO 可变帧率性能功耗平衡三层架构。根因不是固定 60Hz 刷新是性能功耗平衡引擎——Animator.setExpectedFrameRateRange(属性动画/显式动画的帧率属性参数,API 12)+ UIContext.setFrameRateRange(Swiper DynamicSyncScene 帧率范围,API 12)+ DisplaySync 独立绘制帧率(@ohos.graphics.displaySync,displaySync.create 造实例,setExpectedFrameRateRange 设独立绘制帧率,on(‘frame’) 帧回调,start/stop 启停,不干扰系统可变帧率机制,API 12)+ LTPO 硬件级 1-120Hz 自适应刷新率(低温多晶氧化物,按需调整显示刷新率,API 26)。ExpectedFrameRateRange 三字段 expected 期望帧率(系统优先)/ min 最小 / max 最大(不建议全设 120 干扰系统可变帧率机制影响功耗长时 120Hz 导致手机过热)。鸿蒙 7.0 LTPO 四场景帧率建议:高帧率 90-120Hz(启动/转场,全屏非持续动效)/ 中等 60Hz(弹幕/翻页,变化区域大的持续型动效)/ 低帧率 15-30Hz(转盘/转圈,小区域动效/微动效)/ 跟随源帧率(插画动效,不长时高帧率)。性能功耗平衡引擎精细化场景帧率控制是鸿蒙 7.0 LTPO 可变帧率核心!
更多推荐



所有评论(0)