众多App在开发和运用过程中,选择恰当的性能评估标准十分关键。虽然FPS一度备受关注,但它并不适合所有App。那么,究竟该采用何种标准进行精准评估?又该如何提高App的运行流畅性?接下来,我们将深入探讨这些问题。
FPS局限性
FPS是评估游戏或视频应用性能的一个标准,历史悠久。但这个标准并不适用于界面更新较少的应用。因为屏幕是自上而下、自左向右刷新的,如果帧率超过了刷新率,屏幕在完成前一帧数据的刷新之前,就会开始生成新帧数据,这会导致新帧覆盖掉前一帧,从而影响实际的使用体验。
在众多更新不频繁的应用中,即便帧率数值表现尚可,使用时仍可能觉得操作不够顺滑。这一点充分表明,帧率并不能全面展现这类应用的性能,我们必须寻找更恰当的评价标准。
系统合成帧率
系统合成帧率(FPS)数据一目了然,是衡量显示性能的早期标准之一,且在各个平台上定义相近。对系统平台的要求不高,只要API level 1就能满足。对于游戏、视频等需要持续绘制的应用,选用FPS作为评估标准较为适宜。
大多数非连续绘制功能的应用并不适用此方法。以某些电商平台的应用为例,它们在日常使用中界面相对固定,只有在用户操作时才会进行更新。在这种情况下,仅凭帧率来评估性能是不准确的,还需要借助其他指标来进行综合评估。
adb shell dumpsys gfxinfo yourpackagename
流畅度指标
SM数据的呈现方式与FPS相似,但它在弥补FPS不足方面表现出色。在非连续绘制场景中,SM能更精确地反映显示性能。我们通常用Loop在1秒内运行的次数来衡量App的最高绘制能力,这也就是App卡顿的体现。
通过实际测试,我们运用Choreographer的FrameCallback功能来统计Loop的执行频率,从而了解App的运行流畅度。这样的方法使得开发者能够更准确地掌握App在正常使用中的流畅表现,尤其是对于那些运行逻辑较为复杂的App。
应用跳帧次数及幅度
采集累计帧数和帧变化幅度数据的方法操作简便,只需利用系统内置功能即可实现。然而,这种方法对系统平台的要求较为严格。通过这种方式获得的渲染时间仅限于UI主线程的绘制活动,因而存在一定的限制。
adb shell dumpsys SurfaceFlinger packagename
“在‘GPU呈现模式分析’中,我们只能看到最近的128帧数据。然而,数据丢失可能是由于在两帧之间进行了较长时间的操作所引起的。以社交应用为例,当用户频繁加载图片时,这种现象就可能发生。因此,仅凭这一指标来评估应用性能是不够全面的。”
adb shell dumpsys gfxinfo
丢帧计算
在Android的2D渲染器中,Process指的是处理显示列表所需的时间。显示的view越多,绘制的指令也就越多,所需时间相应增长。若在单次循环中,处理时间超过16.6毫秒,便会导致帧丢失。将超出部分的时间除以16.6毫秒,即可计算出当前应用的帧丢失数量。
04-18 16:31:24.957 I/Choreographer(24164): Skipped 4 frames! The application may be doing too much work on its main thread.
04-18 16:31:25.009 I/Choreographer(24164): Skipped 2 frames! The application may be doing too much work on its main thread.
在开发实践中,遇到功能繁杂、界面元素众多的应用时,丢帧现象较为普遍。比如,大型电商应用的商品详情页面,若未进行优化,便可能发生丢帧,进而影响用户的使用感受。我们可以通过比较连续两帧的渲染启动时间差,来掌握丢帧的具体情况。
提升流畅度方法
为确保App运行顺畅,除了确立恰当的性能评估标准,我们还需实施策略。过多的资源和复杂的逻辑会引起加载与执行速度减慢。这时,Link工具能帮助我们识别出影响流畅度的性能瓶颈。在开发阶段,开发者应削减冗余代码和资源,同时优化算法与逻辑。
开发者能够通过VSync机制得知App的最大绘图效能,并据此对性能上的限制进行有针对性的调整。比如,在部分视频播放应用中,通过改进播放算法和资源加载策略,成功提高了播放的顺滑度。在使用App时,你是否遇到过某个应用运行不畅的情况?欢迎分享你的体验。若觉得这篇文章对你有帮助,请点赞并转发!