安卓性能调优之-掉帧测试

掉帧指的是某一帧没有在规定时间内完成渲染,导致 UI 画面不流畅,产生视觉上的卡顿、跳帧现象。

  1. Android目标帧率
    • 一般情况下,Android设备的屏幕刷新率是60Hz,即每秒需要渲染60帧(Frame Per Second, FPS)。
  2. 每帧时间预算
    • 60 FPS → 1秒钟1000ms / 60 ≈ 16.67ms,即每一帧的渲染时间不能超过16.67ms,否则就会出现掉帧。
    • 120Hz设备 → 每帧8.33ms预算。
  3. 掉帧的直观表现
    • 页面滑动、动画卡顿或不流畅。
    • 操作有延迟,UI反馈慢。
  4. 即呈现速度缓慢和帧冻结判断
    • 呈现速度缓慢:在呈现速度缓慢的帧数较多的页面,当超过50%的帧呈现时间超过16毫秒时,用户感官明显卡顿。
    • 帧冻结:帧冻结的绘制耗时超过700ms,为严重卡顿问题。

RecyclerView卡顿掉帧测试

续集上篇文章,在 ExampleStartupBenchmark 继续加如以下代码:

private final String TARGET_PACKAGE_NAME = "com.xxx.demo";//...@Testpublic void scrollRecyclerView() {mBenchmarkRule.measureRepeated(TARGET_PACKAGE_NAME, // 你的应用包名Collections.singletonList(new FrameTimingMetric()), // 记录 UI 帧率信息CompilationMode.DEFAULT, // 默认编译模式5, // 测试 5 次scope -> {Log.d("xaye","scrollRecyclerView test begin");// **1. 启动 MainActivity**scope.startActivityAndWait();try {Thread.sleep(4000); // 等待界面切换} catch (InterruptedException e) {throw new RuntimeException(e);}// **3. 执行 RecyclerView 滚动**performRecyclerViewScroll();return null;});}private void performRecyclerViewScroll() {// 查找 RecyclerViewUiScrollable recyclerView = new UiScrollable(new UiSelector().className("androidx.recyclerview.widget.RecyclerView"));if (recyclerView.exists()) {try {Log.d("xaye","performRecyclerViewScroll");recyclerView.flingForward(); // 滑动一屏recyclerView.flingBackward(); // 滑动回去} catch (Exception e) {e.printStackTrace();}}}

和前面文章《安卓性能调优之-检测应用启动速度》介绍的一样,先安装 release版本应用,系统没有要求可以是user版本的,点击 scrollRecyclerView()左边的运行按钮 “RUN scrollRecyclerView”,然后会重启应用,上面代码中 Thread.sleep(4000),是给你留4s时间去点击到 含有 recycleview 的界面,然后就可以自动进行滑动测试了。

在这里插入图片描述
点击测试右侧蓝色字体,进入查看详情界面:
在这里插入图片描述
可以通过选择CPU波动范围较大的区域和右侧火焰图查看代码具体耗时情况,根据具体代码,进行解决,一般的耗时解决包括:异步图片加载、避免主线程I/O、对象池化等…

测试结果分析

1. frameCount(帧数量统计)
min 131.0,   median 210.0,   max 218.0
  • 含义:测试期间记录的渲染帧总数,反映滚动的持续时间和流畅度。
  • min (131):最低帧数,可能出现在滚动启动或停止阶段。
  • median (210):中位数帧数,代表典型滚动场景的帧数量。
  • max (218):最高帧数,接近连续滚动的理想状态。

分析
帧数范围较集中(131-218),中位数210表明整体滚动较为稳定,但最低131帧可能存在启动阶段的性能开销。


2. frameDurationCpuMs(CPU每帧处理耗时百分位)
P50 11.6,   P90 17.3,   P95 20.4,   P99 33.8
  • 含义:CPU处理单帧所需时间的百分位分布(单位:毫秒)。
  • P50 (11.6ms):50%的帧CPU耗时≤11.6ms(优于16.67ms的60fps标准)。
  • P90 (17.3ms):90%的帧≤17.3ms(接近60fps临界值)。
  • P95 (20.4ms):5%的帧存在轻微卡顿(>16.67ms)。
  • P99 (33.8ms):1%的帧明显卡顿(约30fps)。

关键阈值

  • ≤16.67ms:可维持60fps流畅渲染。
  • >16.67ms:帧率下降,用户可能感知卡顿。

性能结论

  • 90%的帧满足60fps要求,但顶部5%的帧存在优化空间,尤其是1%的严重卡顿(33.8ms)。

3. Traces: Iteration 0 1 2 3 4
  • 含义:测试共执行5次独立迭代,排除偶然性,确保结果可靠性。
  • 最佳实践:若某次迭代结果异常(如极端值),需检查是否因系统后台任务干扰。

指标达标情况
P50 CPU耗时11.6ms✅ 优秀 (<<16.67ms)
P90 CPU耗时17.3ms⚠️ 临界 (≈16.67ms)
P95 CPU耗时20.4ms❌ 卡顿 (>16.67ms)
P99 CPU耗时33.8ms❌ 严重卡顿

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/79095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【运维自动化-标准运维】职能化功能如何使用?

职能化功能主要用于一些固化的标准流程可以通过权限开放的方式给到那些负责固定职能的非运维人员&#xff0c;比如外包操作员来执行操作&#xff0c;如此可以释放一些运维的人力&#xff0c;让其可以专注流程的建设和优化。实操演示 新建职能化流程&#xff08;运维角色操作&a…

游戏引擎学习第224天

回顾游戏运行并指出一个明显的图像问题。 回顾一下之前那个算法 我们今天要做一点预加载的处理。上周刚完成了游戏序章部分的所有剪辑内容。在运行这一部分时&#xff0c;如果观察得足够仔细&#xff0c;就会注意到一个问题。虽然因为视频流压缩质量较低&#xff0c;很难清楚…

【小沐学GIS】基于C++绘制三维数字地球Earth(QT5、OpenGL、GIS、卫星)第五期

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第二期3【小沐学GIS】…

OpenAI 最新发布的 GPT-4.1 系列在 API 中正式上线

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【力扣】day1

文章目录 27.移除元素26. 删除有序数组的重复项 27.移除元素 26. 删除有序数组的重复项 我们仔细看一下这两道题的最后的返回值,为什么第一题返回slow 而第二题返回slow1 最后的返回值该如何返回绝对不是凭感觉,我们自己分析一下第一个slow,从0位置开始, 遇到val值就开始和fas…

完全无网络环境的 openEuler 系统离线安装 ClamAV 的详细步骤

准备工作&#xff08;在外网机器操作&#xff09; 1. 下载 ClamAV RPM 包及依赖 mkdir -p ~/clamav-offline/packages cd ~/clamav-offline/packages# 使用 yumdownloader 下载所有依赖包&#xff08;需提前安装 yum-utils&#xff09; sudo dnf install yum-utils -y sudo y…

3.2.2.2 Spring Boot配置视图控制器

在Spring Boot中配置视图控制器可以简化页面跳转跳逻辑。通过实现WebMvcConfigurer接口的addViewControllers方法&#xff0c;可以直接将URL映射到特定的视图&#xff0c;而无需编写控制器类。例如&#xff0c;将根路径"/"映射到welcome.html视图&#xff0c;当访问应…

数据库—函数笔记

一&#xff0c;数据库函数的分类 内置函数&#xff08;Built-in Functions&#xff09; 数据库系统自带的函数&#xff0c;无需额外定义即可直接调用。 聚合函数&#xff1a;对数据集进行计算&#xff08;如 SUM, AVG, COUNT&#xff09;。 字符串函数&#xff1a;处理文本数据…

YOLOv2训练详细实践指南

1. YOLOv2架构与原理详解 1.1 核心改进点 YOLOv2相比YOLOv1的主要改进&#xff1a; 采用Darknet-19作为backbone&#xff08;相比VGG更高效&#xff09;引入Batch Normalization提高稳定性与收敛速度使用anchor boxes机制代替直接预测边界框引入维度聚类确定anchor boxes尺寸…

详解如何复现DeepSeek R1:从零开始利用Python构建

DeepSeek R1 的整个训练过程&#xff0c;说白了就是在其基础模型&#xff08;也就是 deepseek V3&#xff09;之上&#xff0c;用各种不同的强化学习方法来“雕琢”它。 咱们从一个小小的本地运行的基础模型开始&#xff0c;一边跟着 DeepSeek R1 技术报告 的步骤&#xff0c;…

MCP Server 开发实战 | 大模型无缝对接 Grafana

前言 随着大模型的飞速发展&#xff0c;越来越多的 AI 创新颠覆了过往很多产品的使用体验。但你是否曾想过&#xff0c;在向大型语言模型提问时&#xff0c;它能否根据你的需求精准返回系统中的对应数据&#xff1f;例如&#xff0c;当用户查询 Grafana 服务时&#xff0c;模型…

块存储、文件存储和对象存储的特点、应用场景及区别

块存储、文件存储和对象存储的特点、应用场景及区别 块存储 特点&#xff1a;块存储将数据分割成固定大小的块&#xff0c;每个块都有唯一的标识符。数据以块为单位进行读写操作&#xff0c;适合需要高性能和低延迟的场景。 应用场景&#xff1a;数据库存储、虚拟机磁盘、高性能…

OpenCv--换脸

引言 在当今数字化时代&#xff0c;图像处理技术的发展日新月异。换脸技术作为其中一项极具趣味性和挑战性的应用&#xff0c;吸引了众多开发者和爱好者的目光。OpenCV 作为一款强大的开源计算机视觉库&#xff0c;为我们实现换脸提供了丰富的工具和方法。本文将深入探讨如何使…

安卓基础(SQLite)

基础 import sqlite3# 连接到数据库 conn sqlite3.connect(mydatabase.db) cursor conn.cursor()# 执行查询 cursor.execute("SELECT * FROM users") rows cursor.fetchall()for row in rows:print(row)# 关闭连接 conn.close() 创建一个继承自 SQLiteOpenHelpe…

QuickAPI 核心能力解析:构建数据服务化的三位一体生态

在企业数据资产化运营的进程中&#xff0c;如何打破数据开发与共享的效率瓶颈&#xff0c;实现从 “数据可用” 到 “数据好用” 的跨越&#xff1f;麦聪软件的 QuickAPI 给出了系统性答案。作为 SQL2API 理念的标杆产品&#xff0c;QuickAPI 通过SQL 编辑器、数据 API、数据市…

《计算机视觉度量:从特征描述到深度学习》—生成式人工智能在工业检测的应用

2022 年 11 月 30 日一个很重要的标志事件就是chatgpt的出现&#xff0c;打开了生成式人工智能的开端。这也许会是一个历史性的时刻&#xff0c;今天是2025年4月&#xff0c;过去两年多&#xff0c;那个时刻目前回想还是对本人造成了冲击&#xff0c;一个完全有自主分析能力的生…

【软件测试】自动化测试框架Pytest + Selenium的使用

Pytest Selenium 是一种常见的自动化测试框架组合&#xff0c;用于编写和执行 Web 应用程序的自动化测试。Pytest 是一个强大的 Python 测试框架&#xff0c;而 Selenium 是一个用于浏览器自动化的工具&#xff0c;二者结合使用可以高效地进行 Web 应用的功能测试、UI 测试等。…

煤矿湿喷砂浆搅拌机组创新设计与关键技术研究

引言&#xff1a;湿喷工艺在煤矿支护中的革命性意义 在深部煤矿巷道支护领域&#xff0c;湿喷混凝土技术以其回弹率低&#xff08;<15%&#xff09;、粉尘浓度小&#xff08;<10mg/m&#xff09;的显著优势&#xff0c;逐步取代传统干喷工艺。作为湿喷工艺的核心设备&am…

如何处理ONLYOFFICE文档服务器与Java Web应用间的安全认证和授权

如何处理ONLYOFFICE文档服务器与Java Web应用间的安全认证和授权&#xff1f; 处理 ONLYOFFICE 文档服务器与 Java Web 应用之间的安全认证和授权&#xff0c;通常涉及以下几个关键步骤和技术&#xff1a; 1. JWT (JSON Web Token) 认证 启用 JWT&#xff1a; ONLYOFFICE 文档…

无参数RCE

无参数RCE&#xff08;Remote Code Execution&#xff0c;远程代码执行&#xff09; 是一种通过利用目标系统中的漏洞&#xff0c;在不直接传递用户可控参数的情况下&#xff0c;实现远程执行任意代码的攻击技术。与传统的RCE攻击不同&#xff0c;无参数RCE不依赖外部输入参数…