概览:本文从基础的前台应用功耗概念入手,深入剖析低功耗使用场景、资源使用规则,还提供宝贵的体验建议,并通过案例实操身临其境感受鸿蒙应用的前台低功耗的设计与实现。
什么是前台任务功耗?
前台任务功耗是指应用在用户可见并与其交互时的功耗。在这种情况下,应用需要处理大量的用户界面(UI)更新、事件处理、计算任务以及网络请求等。这些操作都会消耗大量的CPU、内存、网络以及屏幕等资源,从而导致较高的功耗。
低功耗设计的方向
1、帧率:相关的详细低功耗体验设计可参考“基于LTPO的低功耗设计”。
2、前台绘制渲染:相关的详细低功耗体验设计可参考“省电和深色模式下低功耗设计”与“高效利用HWC的 低功耗设计”。
3、前台资源:相关的详细低功耗体验设计可参考“前台资源使用规则”。
前台应用功耗检查工具 Profiler
准备工作:基于Profiler工具检测,需要真机调试,打开开发者选项,启用USB调试并关闭USB充电。禁用USB充电(可避免充电导致的功耗差异)。打开开发者模式中的"
显示刷新频率"开关。
具体操作:设置中搜索"开发者" -> "显示刷新频率"。屏幕上会显示两个数字:第一个数字表示屏幕最高刷新率,第二个数字表示当前实际刷新率。
使用Profiler实时监控观察设备温度变化,以及各器件的功耗数据,确定发热场景和功耗来源。
综合考虑业界共识和用户体验,主要对比CPU耗电量、GPU耗电量、屏幕显示、最终总耗电量。
CPU耗电量
GPU耗电量
屏幕显示:电流为正耗电,为负充电
最终总耗电量
通过对应用功耗关键指标的检测分析,可以帮助开发者降低应用运行时总功耗,提高用户体验感。
前台任务低功耗使用场景
1、省电模式:是一种通过调整设备的设置来降低系统功耗的功能,例如适当降低屏幕亮度和CPU性能。
2、深色模式:是应用程序的一种背景颜色设置,用于将应用程序显示背景颜色改为深色调,例如黑色或深灰色。
3、LTPO:自适应刷新率技术,全称是“Low Temperature Polycrystalline Oxide”。LTPO屏支持1~120Hz的自适应刷新率,使应用在需要高刷新率的场景下提升流畅性,而在视频、静止等场景中使用低刷新率降低显示功耗,延长电池续航。(案例:基于LTPO实现的循环动画、基于LTPO实现滑动条)
4、HWC:全称是Hardware Composer,专用硬件辅助系统进行图形渲染送显,相对于通用计算单元,在图层叠加场景具有更高的处理效率和更低的能耗。作为专用硬件单元,HWC需要满足一定条件才能充分发挥其硬件能力,降低系统CPU/GPU开销,减少发热和卡顿现象的出现。
场景:在视频区域上方合理使用模糊控件,通过去除控件的模糊效果来使能HWC,从而优化场景功耗。(案例:视频区域上方合理使用模糊控)
自适应刷新率通过ExpectedFrameRateRange设置:
ExpectedFrameRateRange中的关键参数是expected(期望帧率)。系统优先按照expected设置的帧率执行。如果系统难以满足expected帧率,会在min和max之间选择一个更合适的帧率提供给应用;
ExpectedFrameRateRange中的expected、min、max都设置为120,这会干扰系统可变帧率机制,增加负载,影响整机性能和功耗,因此不建议锁定最高帧率运行。
案例:基于LTPO实现的循环动画
import { displaySync } from "@kit.ArkGraphics2D"
@Component
export struct avView {
@State rotateAngle: number = 0
// 1、创建display实例对象。
private backDisplaySync: displaySync.DisplaySync | undefined = undefined
// 2、判断DisplaySync实例是否存在,如果不存在就创建DisplaySync实例,如果存在就启动。
aboutToAppear(): void {
if (this.backDisplaySync === undefined) {
this.CreateDisplaySync()
}
if (this.backDisplaySync) {
this.backDisplaySync.start();
}
}
// 3、创建DisplaySync实例、设置帧率、注册订阅函数
CreateDisplaySync() {
// 创建DisplaySync实例
this.backDisplaySync = displaySync.create();
// 设置帧率:降低功耗
// 注册订阅函数:通过回调函数设置图片的旋转角度
this.backDisplaySync.on("frame", (intervalInfo: displaySync.IntervalInfo) => {
if (this.rotateAngle === 360) {
this.rotateAngle = 0;
}
this.rotateAngle += 15;
});
}
// 4、关闭和取消
aboutToDisappear(): void {
if (this.backDisplaySync) {
this.backDisplaySync.stop();
this.backDisplaySync = undefined;
}
}
build() {
Column() {
Image($r('app.media.startIcon'))
.width(300)
.height(300)
.margin(20)
.borderRadius(150)
.rotate({
// 旋转属性
x: 0,
y: 0,
z: 1, // 沿z轴旋转
centerX: '50%',
centerY: '50%',
angle: this.rotateAngle // 旋转角度,为正顺时针旋转,为负逆时针旋转。
})
}
.width('100%')
.justifyContent(FlexAlign.End)
}
}
查看旋转功耗:平均耗电很大608mA
优化旋转帧率:平均耗电很大555mA
// 设置帧率:屏幕刷新率降低功耗也会降低
this.backDisplaySync.setExpectedFrameRateRange({
expected: 30, // 期待帧率
min: 0, // 最小帧率
max: 120 // 最大帧率
})
案例:基于LTPO实现滑动条
使用animateTo方法,通过设置可变帧率,观察功耗差异。
// Slider:滑动条组件,通常用于快速调节设置值,如音量调节、亮度调节等应用场景。
Slider({
value: this.curTime,
min: 0,
max: this.durationTime
})
.onVisibleAreaChange([0.0, 1.0], (isVisible: boolean, currentRatio: number) => {
if (isVisible) {
this.getUIContext().animateTo({
duration: this.durationTime * 1000,
iterations: -1,
expectedFrameRateRange: {
// 设置帧率
expected: 30,
min: 0,
max: 120,
},
}, () => {
if (this.curTime >= this.durationTime) {this.curTime = 0}
for (let i = 0; i < this.durationTime; i++) {this.curTime += 1}
})
}
})
案例:视频区域上方合理使用模糊控
Image($r('app.media.startIcon'))
// 实时模糊开关
.backdropBlur(40)
.backgroundBlurStyle(BlurStyle.BACKGROUND_REGULAR)
前台资源使用规则汇总
音乐播放场景低功耗规则:developer.huawei.com/consumer/cn…
导航定位场景低功耗规则:developer.huawei.com/consumer/cn…
静态场景低功耗规则:developer.huawei.com/consumer/cn…
视频场景编解码低功耗规则:developer.huawei.com/consumer/cn…
视频场景弹幕绘制低功耗规则:developer.huawei.com/consumer/cn…
视频场景ROM低功耗建议:developer.huawei.com/consumer/cn…
视频场景图层低功耗建议:developer.huawei.com/consumer/cn…
视频场景Wi-Fi加载低功耗建议:developer.huawei.com/consumer/cn…
网络资源低功耗建议:developer.huawei.com/consumer/cn…
不可见组件低功耗建议:developer.huawei.com/consumer/cn…
前台应用功耗体验建议汇总
前台帧率:developer.huawei.com/consumer/cn…