本文是「鸿蒙 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.displaySyncDisplaySync(独立绘制帧率,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 可变帧率核心!

Logo

一站式 AI 云服务平台

更多推荐