当前位置: 首页 > news >正文

【性能优化】帧率优化方法:第一步——量化

Android计算帧率的几种方法

    • 一、注册编舞者doFrame
    • 二、使用dumpsys gfxinfo pkg_name计算帧率
      • dumpsys gfxinfo pkg_name
    • 三、抓取trace查看帧率

    对于性能优化来说,要优化必先量化,如果没有量化则无法判断优化方向、优化策略是否正确,也就无法知道优化后是否取得了预期的成效。
    应用在使用过程的卡顿感,一直是一个让人头疼的问题,因为他涉及到系统、应用交互的方方面面。包括:

  • cpu调度是否合理
  • 方法执行时长是否合理
  • 视图结构设计是否合理:有没有绘制性能更好的布局层次
  • binder调用是否卡顿:常见的主线程调用的binder接口,因系统资源紧张出现长耗时导致卡顿
  • io操作的延迟:io wait占比是否合理
    所以,帧率优化的第一步——量化,显得尤为重要,本文总结常见的三种计算帧率的方法,用于实际帧率优化过程中的方向指导。

一、注册编舞者doFrame

Android系统每隔16ms执行一次重绘任务是VSYNC信号驱动的,invalide/requestLayout->ViewRootImpl:performMeasure->ViewRootImpl:performLayout->ViewRootImpl:performDraw->SurfaceFlinger合成,这个过程就是视图的重绘流程。而ViewRootImpl中控制ui执行重绘就是通过注册编舞者的onFrame回调来完成的,因此我们也可以采用该方式来计算到帧率数据。代码如下:

private long lastFrameTimeNanos = 0;
private int frameCount = 0;
private static final long FPS_INTERVAL = 1000_000_000;
Choreographer.getInstance().postFrameCallback(new Choreographer.FrameCallback() {@Overridepublic void doFrame(long frameTimeNanos) {Log.d(TAG, "doFrame: " + frameTimeNanos);Choreographer.getInstance().postFrameCallback(this);//当前的帧率frameCount++;if (lastFrameTimeNanos > 0) {long interval = frameTimeNanos - lastFrameTimeNanos;// 间隔超过1s再计算fps值if (interval >= FPS_INTERVAL) {float fps = frameCount * 1_000_000_000f / interval;Log.d(TAG, "doFrame: fps = " + fps);frameCount = 0;lastFrameTimeNanos = frameTimeNanos;}} else {lastFrameTimeNanos = frameTimeNanos;}Choreographer.getInstance().postFrameCallback(this);}});
  • doFrame方法中的frameTimeNanos代表是每一帧的开始时间戳,用纳秒为单位,除以1000000就是毫秒为单位了。
    输出帧率计算结果:
2025-10-05 19:32:46.762 29510-29510 Chor...itor com...catchanrlog  D  doFrame: fps = 58.56009
2025-10-05 19:32:47.770 29510-29510 Chor...itor com...catchanrlog  D  doFrame: fps = 60.547974
2025-10-05 19:32:48.777 29510-29510 Chor...itor com...catchanrlog  D  doFrame: fps = 60.547493
2025-10-05 19:32:49.785 29510-29510 Chor...itor com...catchanrlog  D  doFrame: fps = 60.547493
2025-10-05 19:32:50.791 29510-29510 Chor...itor com...catchanrlog  D  doFrame: fps = 60.646725
2025-10-05 19:32:51.797 29510-29510 Chor...itor com...catchanrlog  D  doFrame: fps = 60.584347

总结:该计算方式比较只算,是按照fps的定义直接计算出来的,不足之处是只有主线程的doFrame帧率,没法体现renderThread线程的丢帧情况,有一定的局限性。

二、使用dumpsys gfxinfo pkg_name计算帧率

dumpsys gfxinfo pkg_name

输出示例:

Applications Graphics Acceleration Info:
Uptime: 63736043 Realtime: 63736043
** Graphics info for pid 23188 [com.tcl.cyberui] **
Stats since: 56002698393874ns
Total frames rendered: 130
Janky frames: 0 (0.00%)
Janky frames (legacy): 0 (0.00%)
50th percentile: 9ms
90th percentile: 11ms
95th percentile: 11ms
99th percentile: 11ms

计算帧率方法:丢帧数的差值除以总绘制帧数的差值,得到丢帧率,再用1-丢帧率乘以60就得到帧率,如果是120刷新率的则把60换成120即可。
60 * (1 - (Janky frames2-Janky frames1/(Total frames rendered2-Total frames rendered1)))

三、抓取trace查看帧率

  • 1、使用atrace、systrace、或者perfetto等命令抓取trace文件
  • 2、把trace文件拖入https://ui.perfetto.dev/#!/打开,计算帧率
  • 3、帧率计算方式如下:
    帧率计算步骤
http://www.dtcms.com/a/449410.html

相关文章:

  • 【Docker项目实战】使用Docker部署ShowDoc文档管理工具
  • 第13课:成本与性能优化:语义缓存(Semantic Cache)实战
  • 网站搭建备案吗柳州网站seo
  • Witsy: 桌面 AI 助手 / 通用 MCP 客户端
  • 哈尔滨营销网站建设公司哪家好做视频分享网站的参考书
  • 音频焦点学习之AudioFocusRequest.Builder类剖析
  • 国产某能谱仪产品分析
  • 《Vuejs设计与实现》第 5 章(非原始值响应式方案)下 代理数组
  • 网站服务器速度查询北京网站设计公司兴田德润放心
  • 版本控制器git(1)--- git 初识与安装
  • 网站如何收录网络营销策划方案ppt
  • Three.js NodeMaterial 节点材质系统文档
  • 2025 中小企业 AI 转型:核心岗技能 “怎么证、怎么用”?
  • ML4T - 第8章第1节 蒙特卡洛估计夏普率 Monte Carlo Estimation of Sharpe Ratio
  • 滨州企业网站建设WordPress的数据库在哪
  • K230基础-颜色识别
  • git 中常用的命令
  • 网络屏蔽工具,强制软件断网
  • 面试经典150题[049]:合并区间(LeetCode 56)
  • 取名字网站如何做wordpress程序员主题
  • 第7章 n步时序差分 n步时序差分预测
  • 【代码随想录算法训练营——Day28】贪心算法——134.加油站、135.分发糖果、860.柠檬水找零、406.根据身高重建队列
  • 网上服务平台官网入口潍坊百度搜索优化
  • 直播网站怎么做啊如何做php分页网站
  • 【IDE】Linux下使用openocd烧录bin文件
  • 【剑斩OFFER】算法的暴力美学——将 x 减到零的最小操作数
  • Docker(四)—— 使用 Docker 搭建 Nginx 并实现 HTTPS 访问
  • 浏览器中的隐藏IDE: Elements (元素) 面板
  • 【JVM】实战篇(一)
  • 住房城市建设部门户网站一件代发48个货源网站