鸿蒙NEXT开发【省电和深色模式下低功耗设计】功耗优化 ...

金歌  金牌会员 | 2024-11-29 21:09:25 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 860|帖子 860|积分 2580

低功耗优化概述

低功耗是指设备在运行各种使命时,通过接纳一系列技术和战略来低落设备的能耗,从而延长电池寿命和设备使用时间。由于手机等移动设备具有便携、移动的属性,其续航时间的长短直接影响用户对该品牌手机的体验和满足度。移动设备的续航时间越长,用户就可以更长时间地使用设备,无需频繁充电,在户外或旅行场景下提供便利。一样寻常而言,为了提供更长的续航时间,可以采取了多种技术和方法来低落功耗、优化电池管理,如优化软件算法、优化屏幕亮度和显示等。其中,省电模式和深色模式是手机功耗优化中常用的优化手段:


  • 省电模式:一种通过调解设备的设置来低落系统功耗的功能,例如适当低落屏幕亮度和CPU性能。
  • 深色模式:深色模式是应用程序的一种配景颜色设置,用于将应用程序显示配景颜色改为深色调,例如玄色或深灰色。
为了有效去测量手机运行时的功耗,DevEco Profiler提供及时监控(Realtime Monitor)能力,可资助开发者及时监控设备资源(如CPU、内存、FPS、GPU、Energy等)使用情况,其中Energy以3s为周期举行革新,表现统计周期内总功耗以及各耗能部件(包罗CPU、Display、GPU、Location、Other)的功耗占用情况。综合考虑业界共识指标和现实用户使用体验,实验将主要对比屏幕显示耗电量、CPU耗电量、GPU耗电量以及终极总耗电量,关键指标如下所示:


  • 显示耗电量:显示耗电量是手机耗电的主要来源之一,它通常占总能耗的很大比例,影响显示耗电量的关键因素包罗屏幕亮度、显示内容、革新率等。
  

  • CPU耗电量:高性能的使命通常必要更多的CPU计算能力,导致较高的CPU耗电量,影响CPU耗电量的关键因素包罗CPU的工作频率、功耗管理战略以及对使命的调理和分配等。
  • GPU耗电量:类似于CPU,高性能的图形使命会导致较高的GPU耗电量,影响GPU耗电量的关键因素包罗GPU的工作频率、工作负载、绘制内容、分辨率、绘制帧率等。
  • 终极总耗电量:终极总耗电量是指设备在特定使用场景下的总能耗,包罗屏幕显示、CPU计算和GPU图形处理等。它反映了设备在某种使用情境下的总体能耗水平。
本文将以 “HMOS天下”APP 为例,通过设置省电模式和深色模式来验证差异场景下对手机功耗的影响,观察手机的电量斲丧变化情况。同时本文还探讨了主动低落应用亮度、停止冗余动画两项低落功耗的步伐,测试差异条件下的电量斲丧情况。实验结果表明:


  • 主动省电模式:设置省电模式后,系统会自动调节屏幕亮度、调解灭屏时间等配置项,使得耗电量在显示模块低落明显,总耗电量随之低落约12%。
  • 主动深色模式:通过主动切换深色模式,OLED屏幕可以使用更少的像素点和背光,实现更低的亮度和对比度。相对于正常模式,总耗电量低落约24.5%。
  • 主动调节屏幕亮度:应用主动发起屏幕亮度调节时,可以通过主动低落应用的亮度来减少显示屏的功耗,延长设备的续航时间。相对于正常模式,总耗电量降幅约为36.9%。
  • 停止冗余动画:冗余的动画绘制指的是在屏幕上绘制不必要或重复的动画结果,通过停止冗余动画可以减少GPU的工作量,从而低落GPU的功耗。相对于正常模式,总耗电量降幅约为40.2%。
通过设置省电模式、深色模式、调节屏幕亮度调节、停止冗余动画,终极测量的总耗电量对好比下图所示:
图1 总耗电量对比

功耗测量工具

DevEco Profiler

DevEco Profiler应用调优工具(以下简称为Profiler)内置集成在DevEco Studio内,提供场景化的调优体验,不仅方便开发者及时相识应用或服务的CPU、内存、图形等资源的使用情况,还提供了高效的问题定位能力,资助开发者快速定位到问题所在代码。使用Profiler测试应用程序功耗的方法如下所示:

  • 打开Profiler:在DevEco Studio内可以通过以下三种方式打开Profiler

    • 在DevEco Studio顶部菜单栏中选择“View -> Tool Windows -> Profiler”。
    • 在DevEco Studio底部工具栏中单击“Profiler”。
    • 按“Double Shift”或者“Ctrl+Shift+A”打开搜索功能,搜索“Profiler”。

  • 毗连设备:将设备通过USB毗连到计算机上。
  • 选择应用程序:在Profiler中,选择要测试的应用程序并开启Realtime Monitor。
  • 举行应用程序操纵:在设备上举行应用程序操纵,如欣赏网页、播放视频等。
  • 查看结果:右侧区域展示时间窗内Energy资源的及时使用情况,将鼠标悬浮于统计图中任意位置,打开时间标线,左右移动鼠标并结合时间轴可查看差异时间点上的及时信息。
Profiler耗电量表示图如下所示
图2 ProfilerEnergy模块表示图

说明


  • 上图区域展示时间窗内CPU、Memory、FPS、GPU、Energy资源的及时使用情况,将鼠标悬浮于统计图中任意位置,打开时间标线,左右移动鼠标并结合时间轴可查看差异时间点上的及时信息。
  • Energy以3s为周期举行革新,表现统计周期内总功耗以及各耗能部件(包罗CPU、Display、GPU、Location、Other)的功耗占用情况。
程控电源

程控电源是一种可以举行电压、电流、功率、电阻等参数控制的电源设备,它可以根据用户设定的参数来输出相应的电压和电流,从而满足差异的测试需求。程控电源可以通过编程控制来模拟差异的负载条件,从而测试应用程序在差异负载下的功耗表现。通过这种方式,开发人员可以更好地相识应用程序的能耗特性,从而针对性地举行优化。
使用程控电源测试应用程序功耗的方法如下所示:

  • 毗连设备:首先必要将程控电源毗连到待测设备的电源输入端,并确保毗连正确。
  • 设置测试条件:在程控电源上设置测试条件,包罗电压、电流、功率等参数。
  • 举行应用程序操纵:在设备上运行待测应用程序,并举行应用程序操纵,如欣赏网页、播放视频等。
  • 收集数据:在测试过程中,程控电源会及时记录设备的功耗数据,包罗电压、电流、功率等信息。
省电模式

原理先容

HarmonyOS默认提供了电源模式的特性,主要分为以下三类:


  • 正常模式:默认的电源模式,无特殊需求的情况下,此模式下的系统亮度、灭屏时间,进入就寝时间等均适合大部门用户的必要。
  • 性能模式:夸大性能表现的电源模式,如增长系统亮度、关闭灭屏时间、防止进入就寝等。
  • 省电模式:夸大省电表现的电源模式,如低落系统亮度、紧缩灭屏时间等。
    切换了电源模式后,随之更改的配置项有:
  

  • 灭屏时间:可设置时长或关闭灭屏功能。主要涉及模块为显示。
  • 自动调节亮度:可以设置开启或关闭自动调节亮度功能。主要涉及模块为传感器和显示。
  • 自动调节屏幕旋转:可以设置开启或关闭自动调节屏幕旋转功能。主要涉及模块为传感器和显示。
  • 系统亮度:可以设置0~255的取值。主要涉及模块为显示。
  • 震惊开关:可以设置开启或关闭震惊功能,主要涉及模块为马达。
说明
在电源管理方面,HarmonyOS接纳了自动切换配置,通过更改差异的配置项来实现差异的电源模式。例如,在正常模式下,系统会自动调节屏幕旋转,以保证用户在横屏和竖屏模式下都能够得到最佳的视觉结果;而在省电模式下,系统会关闭这一功能,以低落屏幕旋转带来的能耗。
场景案例

当设备电量较低时,系统可以切换至省电模式,以减少设备的能耗并延长电池的使用时间。通过与系统省电模式的配合,应用程序可以更加智能地调解自身的功耗战略,以顺应设备电量较低的情况,从而延长设备的续航时间,提供更加稳定和持久的使用体验。
一样寻常而言,获取当前设备的电源模式可以通过以下步骤实现:

  • 引入系统电源管理模块power,该模块主要提供重启、关机、查询屏幕状态等接口;
  • 调用power的getPowerMode方法来获取当前设备的电源模式。
图3 开启省电模式

在省电模式下,获取当前系统的电源模式的代码如下所示:
  1. import { router } from '@kit.ArkUI';
  2. import { common } from '@kit.AbilityKit';
  3. import { LearningResource, ActionButtonView, CommonConstants, ArticleCardButtonView } from '@ohos/common';
  4. // 引入power模块
  5. import { power } from '@kit.BasicServicesKit';
  6. @Component
  7. export struct ArticleCardView {
  8.   @Prop isLiked: boolean = false;
  9.   @Prop isCollected: boolean = false;
  10.   @ObjectLink articleItem: LearningResource;
  11.   onCollected?: () => void;
  12.   onLiked?: () => void;
  13.   build() {
  14.     Row({ space: CommonConstants.SPACE_16 }) {
  15.       Column() {
  16.         // ...
  17.         Row() {
  18.           ActionButtonView({
  19.             imgResource: $r('app.media.ic_eye_open'),
  20.             count: this.articleItem.viewsCount,
  21.             textWidth: $r('app.float.view_count_icon_width')
  22.           })
  23.           // 使用getPowerMode获取当前系统的电源模式,并判断当前是否为省电模式
  24.           if (power.getPowerMode() == power.DevicePowerMode.MODE_POWER_SAVE) {
  25.             ActionButtonView({
  26.               imgResource: this.isLiked ? $r('app.media.btn_good_on') : $r('app.media.btn_good_normal'),
  27.               count: this.articleItem.likesCount,
  28.               textWidth: $r('app.float.like_icon_width')
  29.             })
  30.               .onClick(() => {
  31.                 this.onLiked?.();
  32.               })
  33.             // ...
  34.           } else {
  35.             ArticleCardButtonView({
  36.               clickAnimationPath: 'common/lottie/liked_lottie.json',
  37.               cancelAnimationPath: 'common/lottie/cancel_liked_lottie.json',
  38.               isClicked: this.isLiked,
  39.               count: this.articleItem.likesCount,
  40.               articleId: this.articleItem.id,
  41.               textWidth: $r('app.float.like_icon_width'),
  42.               type: 'like',
  43.               onClicked: this.onLiked,
  44.               normalImage: $r('app.media.btn_like_normal'),
  45.               onImage: $r('app.media.btn_like_on')
  46.             })
  47.             // ...
  48.           }
  49.         }
  50.         .width(CommonConstants.FULL_PERCENT)
  51.         .justifyContent(FlexAlign.SpaceBetween)
  52.       }
  53.       .layoutWeight(1)
  54.       .height(CommonConstants.FULL_PERCENT)
  55.       .justifyContent(FlexAlign.SpaceAround)
  56.     }
  57.    }
  58. }
复制代码
功耗分析

同一界面下滑动列表项,分别对比正常模式和省电模式来测试关闭和开启省电模式情况下的总耗电量和CPU模块、GPU模块、显示模块的耗电量。终极,使用IDE的Profiler工具测量得到的数据如下所示:
图4 使用省电模式前后耗电量对比

从测试数据可以看出:

  • CPU和GPU模块的耗电量几乎没有变化。这表明在测试条件下,这两个模块的能耗表现相对稳定,不受省电模式的影响。
  • 显示模块耗电量降落明显,降幅达到13.2%。这表明省电模式对于显示模块的能耗有着明显的影响。
  • 总耗电量有部门降落,降幅接近12.0%。
这一结果表明省电模式的使用对设备的节能有着明显的结果,通过低落亮度、开启自动调节亮度等方式,省电模式低落了显示模块的能耗,从而达到了低落总体能耗的目标。
深色模式

原理先容

通过启用深色模式,可以进一步实现能耗的低落。首先,深色模式使用更少的像素点和背光,因此能够减少能量的斲丧。其次,深色模式在OLED屏幕上可以关闭像素点,这一特性进一步减少了能耗。在现实开发过程中,应用必要根据当前设备状态来适配深色模式,开发者可以通过设置分层参数数据实现:

  • 新建一个资源目录,选择必要根据深浅颜色模式(Color Mode)区分,举行分层数据读取。
  • 在color.json文件中,设计对应组件读取的数据。
场景案例

在应用省电模式后,继续在“我的“界面下设计为深色模式可以在显示模块得到更大的收益,一样寻常而言应用深色模式可以通过以下步骤实现:

  • 创建深色模式资源文件夹:在项目标resources文件下,创建深色模式的Dark资源文件夹,如下图1所示。
    图5 创建深色模式资源文件夹

  • 资源文件适配:为深色模式下的界面设计相应的颜色和图标资源文件。
  • 在主题中设置深色模式样式:在应用的主题中界说深色模式的样式,包罗配景色、文本颜色、图标颜色等。
  • 动态切换模式:在应用中实现动态切换深色模式和浅色模式的功能,使用户可以根据本身的喜好随时切换应用的界面模式。
  • 测试和优化:在实现深色模式后,必要举行充实的测试,确保在深色模式下界面的显示结果和用户体验都符合预期,对用户举行友好的提示和引导。
图6 深色模式表示图

功耗分析

同一界面下,分别对比测试关闭和开启深色模式情况下的总耗电量和CPU模块、GPU模块、Display模块的耗电量。终极,使用IDE的Profiler工具检测得到的数据如下所示:
图7 使用深色模式前后耗电量对比

根据测试数据分析,我们可以得出以下结论:

  • 在CPU和GPU模块方面,耗电量并没有发生明显变化,保持了相对稳定的状态。这表明在当前测试条件下,CPU和GPU的能耗未受到深色模式的影响。
  • 显示模块的耗电量大幅降落,降幅达到了28.6%。
  • 综合考虑以上数据,总耗电量有小幅度降落,降幅达到了14.2%。
这一结果表明深色模式的使用对设备的团体能耗具有积极的影响,可以有效低落设备的能耗水平。深色模式通过减少必要点亮的像素点数目,从而有效低落了显示模块的功耗。
其他优化步伐

优化步伐先容

在省电模式和深色模式下,根据差异的应用场景,通常还有以下常用的优化方式:


  • 主动低落应用亮度:可以通过主动低落应用的亮度来减少显示屏的功耗,延长设备的续航时间。
  • 主动低落音量大小:低落设备的音量大小可以减少功耗,尤其是在使用耳机或扬声器时。这一优化方式可以在一定程度上减少设备的能耗,延长电池的使用时间。
  • 停止一些冗余动效:减少动效的运行可以低落系统功耗的开销,例如太过的页面切换动画、图标动效等。
  • 视频场景数据缓存按聚合方式下载:视频的wifi下载建议一次下载大量内容然后空闲一段时间,不建议连续不断的以小流量的速率下载(如每20s下载一次,每次下载3~5s)。
通过采取以上常用的优化方式,可以在省电模式和深色模式下进一步低落设备的能耗,延长电池的使用时间,提升用户体验。同时,结合测试数据的结果,可以更加明白地相识差异优化方式对设备能耗的影响,从而更好地指导现实的优化工作。
场景案例

在设计和开发应用时,必要考虑差异的使用场景必要差异的优化步伐来低落功耗。例如,在运行视频应用程序时,可以接纳低落亮度、调解革新率和关闭不必要的背光等步伐来低落功耗。而在运行音频应用程序时,则可以接纳关闭不必要的传感器、减少CPU负载等步伐来低落功耗。结合场景按需选择优化步伐黑白常重要的,可以资助设备在差异的使用场景下提供最佳的性能和用户体验,并最大限度地低落功耗。


  • 主动低落应用亮度
主动低落应用亮度总共分为以下几步:

  • 根据UIAbility的context的配置信息,判断当前是否深色模式;
  • 通过WindowStage的[getMainWindowSync]方法,获取当前主窗口Window对象;
  • 使用Window对象的[setWindowBrightness]方法设置当前应用的屏幕亮度;
在夜间模式下增长主动低落应用亮度,具体代码实现如下:
  1. export default class EntryAbility extends UIAbility {
  2.   ...
  3.   onWindowStageCreate(windowStage: window.WindowStage) {
  4.     ...
  5.     // 判断当前是否为深色模式
  6.     if (this.context?.config?.colorMode == ConfigurationConstant.ColorMode.COLOR_MODE_DARK) {
  7.       let windowClass = windowStage.getMainWindowSync();
  8.       try {
  9.         // 设置当前应用窗口亮度
  10.         windowClass.setWindowBrightness(0.2, (err) => {
  11.           if (err.code) {
  12.             console.error('Failed to set the brightness. Cause: ' + JSON.stringify(err));
  13.             return;
  14.           }
  15.           console.info('Succeeded in setting the brightness.');
  16.         });
  17.       } catch (exception) {
  18.         console.error('Failed to set the brightness. Cause: ' + JSON.stringify(exception));
  19.       }
  20.     }
  21.   }
  22.   ...
  23. }
复制代码


  • 停止一些冗余动效
在HMOS天下App的案例中,点赞、收藏的动画在省电和深色模式下会斲丧更多的资源,可以主动关闭这些冗余动效,关闭的过程主要分以下几步:

  • 导入系统电源管理power模块;
  • 根据power的[getPowerMode]获取当前设备的电源模式,并判断当前是否为省电模式;
  • 根据现实场景,停止或者更换冗余的动效;
图8 省电和深色模式下停止冗余动效

在省电模式下停止点赞、收藏动画,具体代码实现如下:
  1. import { router } from '@kit.ArkUI';
  2. import common from '@ohos.app.ability.common';
  3. import { LearningResource, ActionButtonView, CommonConstants, ArticleCardButtonView } from '@ohos/common';
  4. import { power } from '@kit.BasicServicesKit';
  5. @Component
  6. export struct ArticleCardView {
  7.   @Prop isLiked: boolean = false;
  8.   @Prop isCollected: boolean = false;
  9.   @ObjectLink articleItem: LearningResource;
  10.   onCollected?: () => void;
  11.   onLiked?: () => void;
  12.   build() {
  13.     Row({ space: CommonConstants.SPACE_16 }) {
  14.       Column() {
  15.         ...
  16.         Row() {
  17.           ActionButtonView({
  18.             imgResource: $r('app.media.ic_eye_open'),
  19.             count: this.articleItem.viewsCount,
  20.             textWidth: $r('app.float.view_count_icon_width')
  21.           })
  22.           // 判断是否为省电模式
  23.           if (power.getPowerMode() == power.DevicePowerMode.MODE_EXTREME_POWER_SAVE) {
  24.             // 设置点赞和收藏的图片
  25.             ActionButtonView({
  26.               imgResource: this.isLiked ? $r('app.media.btn_good_on') : $r('app.media.btn_good_normal'),
  27.               count: this.articleItem.likesCount,
  28.               textWidth: $r('app.float.like_icon_width')
  29.             })
  30.               .onClick(() => {
  31.                 this.onLiked?.();
  32.               })
  33.             ActionButtonView({
  34.               imgResource: this.isCollected ? $r('app.media.btn_favorites_on') : $r('app.media.btn_favorites_normal'),
  35.               count: this.articleItem.collectionCount,
  36.               textWidth: $r('app.float.star_icon_width')
  37.             })
  38.               .onClick(() => {
  39.                 this.onCollected?.()
  40.               })
  41.           } else {
  42.             // 设置点赞、收藏的lottie动画
  43.             ArticleCardButtonView({
  44.               clickAnimationPath: 'common/lottie/liked_lottie.json',
  45.               cancelAnimationPath: 'common/lottie/cancel_liked_lottie.json',
  46.               isClicked: this.isLiked,
  47.               count: this.articleItem.likesCount,
  48.               articleId: this.articleItem.id,
  49.               textWidth: $r('app.float.like_icon_width'),
  50.               type: 'like',
  51.               onClicked: this.onLiked,
  52.               normalImage: $r('app.media.btn_like_normal'),
  53.               onImage: $r('app.media.btn_like_on')
  54.             })
  55.             ArticleCardButtonView({
  56.               clickAnimationPath: 'common/lottie/collected_lottie.json',
  57.               cancelAnimationPath: 'common/lottie/cancel_collect_lottie.json',
  58.               isClicked: this.isCollected,
  59.               count: this.articleItem.collectionCount,
  60.               articleId: this.articleItem.id,
  61.               textWidth: $r('app.float.star_icon_width'),
  62.               type: 'collect',
  63.               onClicked: this.onCollected,
  64.               normalImage: $r('app.media.btn_collect_normal'),
  65.               onImage: $r('app.media.btn_collect_on')
  66.             })
  67.           }
  68.         }
  69.         .width(CommonConstants.FULL_PERCENT)
  70.         .justifyContent(FlexAlign.SpaceBetween)
  71.       }
  72.       .layoutWeight(1)
  73.       .height(CommonConstants.FULL_PERCENT)
  74.       .justifyContent(FlexAlign.SpaceAround)
  75.       ...
  76.     }
  77.     ...
  78.   }
  79. }
复制代码
功耗分析

同一界面下,在设置了省电模式和深色模式的前提下,测试主动减少应用亮度前后、去掉冗余动画前后的CPU模块、GPU模块、显示模块的耗电量和总耗电量。终极,使用IDE的Profiler工具检测得到的数据如下所示:
图9 主动低落应用亮度前后耗电量对比

图10 去掉冗余动画前后耗电量对比

从测试数据可以看出:

  • 主动低落应用亮度的主要效用表现在显示模块,显示模块降幅约为23.7%。
  • 停止冗余动画的主要效用表现在GPU模块,GPU模块降幅约为17.7%。
  • 主动低落应用亮度后,总耗电量降幅约为16.4%。而停止点赞、收藏动画后,总耗电量降幅约为5.3%。
总结

针对”HMOS天下”的功耗优化这一场景,分别使用省电模式和深色模式对其优化,再增长其他可选的保举优化项,测试其在对应的GPU模块和显示模块的耗电量。测试表明,相比力正常模式,当开启省电模式和深色模式后,功耗降落明显,而针对应用需求,主动低落应用亮度、去掉冗余动画等方式后,功耗在对应模块连续降落。其各项对比指标数据如下所示:
性能指标开启省电模式开启深色模式主动低落应用亮度显示耗电量降落率13.2%21.9%15.4%总耗电量降落率12.0%12.5%12.4% GPU耗电量降落率总耗电量降落率去掉冗余动画17.7%3.3% 通过以上数据,可以清楚地看到接纳省电模式和深色模式可以有效地减少设备的能耗。


  • 省电模式能够有效延长电池的使用时间,低落设备的发热和功耗,为用户提供更加持久的设备使用体验。
  • 相比亮色界面,深色模式在OLED和AMOLED屏幕上能够明显减少功耗,由于这些屏幕类型在显示玄色时能够关闭相应的像素,从而低落能耗。深色模式不仅能够减少屏幕的功耗,还能够在夜间或低光情况下减少眩光,提高用户的视觉舒服度。
  • 除了省电模式和深色模式,根据特定场景举行定制的优化步伐也可以进一步低落设备的功耗。而且,定制化的优化步伐能够更好地满足用户的现实需求,提供更加个性化和高效的节能方案。
在应用开发中,开发者可以接纳一些技术手段来低落应用的功耗为用户提供更加节能高效的应用体验,满足用户对于续航能力的需求。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金歌

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表