如何使用 Flutter DevTools 和 PerformanceOverlay 监控性能瓶颈
使用 Flutter DevTools 和 PerformanceOverlay 监控性能瓶颈:详细分析与实战
在开发 Flutter 应用时,性能问题可能会导致用户体验下降,比如页面卡顿、掉帧、内存泄漏等。为了定位和解决这些问题,Flutter 提供了强大的性能监控工具:Flutter DevTools 和 PerformanceOverlay。
本篇文章将详细分析如何使用这两种工具监控性能瓶颈,并结合实际场景提供具体的使用方法。
1. Flutter DevTools
1.1 什么是 Flutter DevTools?
Flutter DevTools 是一个基于 Web 的调试和性能分析工具,提供了以下功能:
- 帧率监控:检查是否有掉帧现象。
- 内存分析:检测内存泄漏和内存占用。
- 布局检查:分析 Widget 树的深度和布局性能。
- 网络请求监控:查看网络请求的详细信息。
1.2 如何启动 Flutter DevTools
步骤 1:运行 Flutter 应用
确保你的应用正在运行在模拟器或真机上:
flutter run
步骤 2:启动 DevTools
- 在终端中输入以下命令:
flutter pub global activate devtools flutter pub global run devtools - 打开浏览器,访问
http://127.0.0.1:9100。
步骤 3:连接到应用
- 在 DevTools 界面中,选择正在运行的 Flutter 应用进行调试。
1.3 使用场景与功能
场景 1:帧率监控
- 问题:页面卡顿或掉帧。
- 解决:使用 DevTools 的 “Performance” 面板,查看帧率和渲染时间。
操作步骤
- 打开 DevTools 的 “Performance” 面板。
- 点击 “Record” 按钮,开始记录性能数据。
- 在应用中执行操作(如滚动列表、点击按钮)。
- 停止记录,查看帧率和渲染时间。
示例代码
class PerformanceExample extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("性能监控示例")),body: ListView.builder(itemCount: 1000,itemBuilder: (context, index) {return ListTile(title: Text("Item $index"),);},),);}
}
分析结果
- 如果帧率低于 60 FPS,说明存在性能瓶颈。
- 检查是否有长时间的布局计算或绘制操作。
场景 2:内存分析
- 问题:应用内存占用过高或内存泄漏。
- 解决:使用 DevTools 的 “Memory” 面板,查看内存使用情况。
操作步骤
- 打开 DevTools 的 “Memory” 面板。
- 点击 “Take Heap Snapshot”,捕获当前内存快照。
- 查看内存中对象的分布情况,检查是否有未释放的资源。
示例代码
class MemoryLeakExample extends StatefulWidget {_MemoryLeakExampleState createState() => _MemoryLeakExampleState();
}class _MemoryLeakExampleState extends State<MemoryLeakExample> {late Timer _timer;void initState() {super.initState();_timer = Timer.periodic(Duration(seconds: 1), (timer) {print("计时器运行中...");});}void dispose() {// 如果忘记释放计时器,会导致内存泄漏_timer.cancel();super.dispose();}Widget build(BuildContext context) {return Scaffold(body: Center(child: Text("内存泄漏示例")),);}
}
分析结果
- 检查是否有未释放的
Timer或Stream。 - 优化代码,确保在
dispose方法中释放资源。
场景 3:布局检查
- 问题:Widget 树过深或布局计算耗时。
- 解决:使用 DevTools 的 “Widget Inspector” 面板,检查 Widget 树的深度和布局性能。
操作步骤
- 打开 DevTools 的 “Widget Inspector” 面板。
- 点击 “Select Widget Mode”,选择需要检查的 Widget。
- 查看 Widget 树的结构和布局信息。
示例代码
class DeepWidgetTreeExample extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(body: Column(children: [for (int i = 00; i < 10; i++)Padding(padding: EdgeInsets.all(8.0),child: Container(color: Colors.blue,child: Text("Item $i"),),),],),);}
}
分析结果
- 如果 Widget 树过深,考虑简化布局或使用
const构造函数优化静态 Widget。
2. 使用 PerformanceOverlay
2.1 什么是 PerformanceOverlay?
PerformanceOverlay 是 Flutter 提供的内置性能监控工具,用于实时显示帧率和渲染性能。
2.2 启用 PerformanceOverlay
在 MaterialApp 或 CupertinoApp 中启用性能叠加:
MaterialApp(debugShowCheckedModeBanner: false,showPerformanceOverlay: true,home: MyApp(),
);
2.3 使用场景与功能
场景 1:实时监控帧率
- 问题:页面滚动时出现卡顿。
- 解决:启用
PerformanceOverlay,实时监控帧率。
示例代码
class ScrollPerformanceExample extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(debugShowCheckedModeBanner: false,showPerformanceOverlay: true,home: Scaffold(appBar: AppBar(title: Text("滚动性能示例")),body: ListView.builder(itemCount: 1000,itemBuilder: (context, index) {return ListTile(title: Text("Item $index"),);},),),);}
}
分析结果
- 绿色条:表示布局时间。
- 蓝色条:表示绘制时间。
- 如果绿色条或蓝色条超过屏幕顶部的红线,说明帧率低于 60 FPS。
场景 2:优化复杂动画
- 问题:动画卡顿或掉帧。
- 解决:使用
PerformanceOverlay检查动画的渲染性能。
示例代码
class AnimationPerformanceExample extends StatefulWidget {_AnimationPerformanceExampleState createState() =>_AnimationPerformanceExampleState();
}class _AnimationPerformanceExampleStateextends State<AnimationPerformanceExample>with SingleTickerProviderStateMixin {late AnimationController _controller;void initState() {super.initState();_controller = AnimationController(duration: Duration(seconds: 2),vsync: this,)..repeat();}void dispose() {_controller.dispose();super.dispose();}Widget build(BuildContext context) {return MaterialApp(debugShowCheckedModeBanner: false,showPerformanceOverlay: true,home: Scaffold(body: Center(child: AnimatedBuilder(animation: _controller,builder: (context, child) {return Transform.rotate(angle: _controller.value * 2 * 3.14159,child: Container(width: 100,height: 100,color: Colors.blue,),);},),),),);}
}
分析结果
- 检查动画的帧率是否稳定在 60 FPS。
- 如果帧率下降,优化动画逻辑或减少绘制复杂度。
3. 总结
3.1 Flutter DevTools 的使用场景
- 帧率监控:检查页面卡顿和掉帧。
- 内存分析:检测内存泄漏和内存占用。
- 布局检查:优化 Widget 树的深度和布局性能。
3.2 PerformanceOverlay 的使用场景
- 实时监控帧率:检查滚动和动画的渲染性能。
- 优化复杂动画:确保动画帧率稳定在 60 FPS。
3.3 实践建议
- 优先使用 DevTools:提供更全面的性能分析功能。
- 结合
PerformanceOverlay:实时监控帧率,快速定位性能问题。 - 持续优化:通过性能监控工具发现问题,优化代码逻辑和布局结构。
通过本篇博客,你应该能够熟练使用 Flutter DevTools 和 PerformanceOverlay 监控性能瓶颈,并在实际项目中灵活应用这些工具,构建高性能的 Flutter 应用!
相关文章:
如何使用 Flutter DevTools 和 PerformanceOverlay 监控性能瓶颈
使用 Flutter DevTools 和 PerformanceOverlay 监控性能瓶颈:详细分析与实战 在开发 Flutter 应用时,性能问题可能会导致用户体验下降,比如页面卡顿、掉帧、内存泄漏等。为了定位和解决这些问题,Flutter 提供了强大的性能监控工具…...
为AI聊天工具添加一个知识系统 之113 详细设计之54 Chance:偶然和适配 之2
本文要点 要点 祖传代码中的”槽“ (占位符变量) 和 它在实操中的三种槽(占据槽,请求槽和填充槽, 实时数据库(source)中数据(流入 ETL的一个正序流程 行列并发 靶向整形 绑定变量 )…...
HTML5 面试题
1. HTML5 新增了哪些重要特性? 语义化标签:这些标签有助于提高页面的可读性和可维护性。多媒体支持:HTML5 引入了 和 标签,可以直接嵌入音频和视频文件,无需依赖插件。本地存储:引入了 localStorage 和 se…...
鸿蒙初学者学习手册(HarmonyOSNext_API14)_自定义动画API(@ohos.animator (动画) )
前言 在纯血鸿蒙中最具有用户特色的效果就是自定义的动画效果。在纯血鸿蒙中有多种定义方式,但是今天介绍的是ApI中的自定义动画。 注意: 动画本身具有生命周期,但是不支持在UIAbility的文件使用,简单而言就是不允许在UIAbility生命周期中…...
PINN求解一维burgers方程
PINN求解一维burgers方程 模型搭建网络与训练结果可视化对比实际结果 完整代码下载链接 PINN求解一维burgers方程 模型 搭建网络与训练 #########-------------- python求解一维burgers方程-------------------################## # -*- coding: utf-8 -*- import os os.envi…...
Linux系统配置阿里云yum源,安装docker
配置阿里云yum源 需要保证能够访问阿里云网站 可以先ping一下看看(阿里云可能禁ping,只要能够解析为正常的ip地址即可) ping mirrors.aliyun.com脚本 #!/bin/bash mkdir /etc/yum.repos.d/bak mv /etc/yum.repos.d/*.repo /etc/yum.repos…...
Android 动态加入Activity 时 manifest 注册报错解决。使用manifestPlaceholders 占位
需求如下: 项目 测试demo 有多个渠道,部分渠道包含支付功能,在主测试代码外,需要一个单独 Activity 调用测试代码。 MainActivityPayActivity渠道A包含不包含渠道B包含包含 因为支付功能需要引入对应的 moudule,因此…...
【找工作】C++和算法复习(自用)
文章目录 C头文件自定义排序函数stl 算法树状数组 自用随便记录 C 排序 stl 头文件 全能头文件: #include<bits/stdc.h>自定义排序函数 bool compare(const int &odd1,const int &odd2) {return odd1>odd2; }stl 枚举map map<int, strin…...
【相聚青岛】人工智能与材料国际学术会议即将召开
一、大会简介 人工智能与材料国际会议(ICAIM 2025) 官方网站:www.ic-aim.net 官方邮箱:icaim2025163.com 会议时间:2025年3.21-24 会议地点:中国青岛 会议检索:EI检索 截稿时间:2月…...
BFS 解决 FloodFill 算法(典型算法思想)—— OJ例题算法解析思路
目录 一、733. 图像渲染 - 力扣(LeetCode) 算法代码: 算法思路 基础参数 函数入口 检查条件 初始化 BFS BFS 填充过程 返回结果 复杂度分析 总结 二、200. 岛屿数量 - 力扣(LeetCode) 算法代码:…...
纷析云开源版- Vue2-增加字典存储到localStorage
main.js //保存字典数据到LocalStorage Vue.prototype.$api.setting.SystemDictType.all().then(({data}) > {loadDictsToLocalStorage(data) })新增 dictionary.js 放在 Utils文件夹里面 // 获取字典数据 export function getDictByType(dictType) {const dicts JSON.par…...
Python 爬虫selenium
1.selenium自动化 selenium可以操作浏览器,在浏览器页面上实现:点击、输入、滑动 等操作。 不同于selenium自动化,逆向本质是: 分析请求,例如:请求方法、请求参数、加密方式等。用代码模拟请求去实现同等…...
前端导出word文件,并包含导出Echarts图表等
基础导出模板 const html <html><head><style>body {font-family: Times New Roman;}h1 {text-align: center;}table {border-collapse: collapse;width: 100%;color: #1118FF;font-weight: 600;}th,td {border: 1px solid black;padding: 8px;text-align: …...
【复现DeepSeek-R1之Open R1实战】系列8:混合精度训练、DeepSpeed、vLLM和LightEval介绍
这里写目录标题 1 混合精度训练1.1 FP16和FP321.2 优点1.3 存在的问题1.4 解决办法 2 DeepSpeed3 vLLM3.1 存在的问题3.2 解决方法3.2.1 PagedAttention3.2.2 KV Cache Manager3.2.3 其他解码场景 3.3 结论 4 LightEval4.1 主要功能4.2 使用方法4.3 应用场景 本文继续深入了解O…...
从面试中的“漏掉步骤”谈自我表达与思维方式的转变
在今天的面试中,我遇到了一个让我深刻反思自己思维方式的问题。当面试官问到如何应对用户量和请求量逐渐增加时,我的回答遗漏了一些基础步骤,导致我给出了“我暂时想不出更好的反思”的回答。这一经历让我意识到,在面对问题时&…...
大模型面经:SFT和RL如何影响模型的泛化或记忆能力?
监督微调 (SFT) 和强化学习 (RL)都是目前大模型的基础模型后训练技术,像DeepSeek-R1、kimi等的训练方法都将两种技术应用到了极致。 如何去设计训练步骤(先SFT再RL,还是直接RL)都需要对SFT和RL的能力有较深刻的了解。 本篇就以面…...
力扣-回溯-17 电话号码的字母组合
思路 和之前的回溯不同的是,要遍历完所有的数字,并且在单层递归逻辑里需要遍历一整个字符串 代码 class Solution { public:vector<string> letters {"", "", "abc", "def", "ghi", "…...
大模型幻觉
1.什么是大模型幻觉? 在语言模型的背景下,幻觉指的是一本正经的胡说八道:看似流畅自然的表述,实则不符合事实或者是错误的。 幻觉现象的存在严重影响LLM应用的可靠性,本文将探讨大型语言模型(LLMs)的幻觉问题,以及解决幻觉现象的一些常见方法。 2.为什么需要解决LLM的…...
2025-02-20 学习记录--C/C++-PTA 7-27 冒泡法排序
一、题目描述 ⭐️ 二、代码(C语言)⭐️ /** * 冒泡法实现升序 */#include <stdio.h>int main() {int N, // 整数个数 6K, // 扫描遍数 2num, // 待排序的整数 2 3 5 1 6 4numArr[100], // 待排序的整数合集 2 3 5 1…...
RK3588配置成为路由器
文章目录 前言一、配置netplan二、安装hostapd1.创建hostapd.conf文件2.安装软件3.修改启动文件4.修改/etc/default/hostapd 文件 三、安装dnsmasq服务四、配置NET及重启验证五、常见问题总结 前言 RK3588开发板有两个网口,一个无线网卡。我需要配置为家用路由器模…...
【数据挖掘】--算法
【数据挖掘】--算法 目录:1. 缺失值和数值属性处理1缺失值处理: 2. 用于文档分类的朴素贝叶斯3. 分治法:建立决策树4. 覆盖算法建立规则5. 挖掘关联规则6. 线性模型有效寻找最近邻暴力搜索(Brute-Force Search)kd树&am…...
Huatuo热更新--如何使用
在安装完huatuo热更新插件后就要开始学习如何使用了。 1.创建主框渐Main 新建文件夹Main(可自定义),然后按下图创建文件,注意名称与文件夹名称保持一致 然后新建场景(Init场景),添加3个空物体…...
基于Django快递物流管理可视化分析系统(完整系统源码+数据库+详细开发文档+万字详细论文+答辩PPT+详细部署教程等资料)
文章目录 基于Django快递物流管理可视化分析系统(完整系统源码数据库详细开发文档万字详细论文答辩PPT详细部署教程等资料)一、项目概述二、项目说明三、研究意义四、系统设计技术架构 五、功能实现六、完整系统源码数据库详细开发文档万字详细论文答辩P…...
基于射频开关选择的VNA校准设计
活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!…...
解决本地模拟IP的DHCP冲突问题
解决 DHCP 冲突导致的多 IP 绑定失效问题 前言 续接上一篇在本机上模拟IP地址。 在实际操作中,如果本机原有 IP(如 192.168.2.7)是通过 DHCP 自动获取的,直接添加新 IP(如 10.0.11.11)可能会导致 DHCP 服…...
ChromeDriver下载
平时为了下个驱动,到处找挺麻烦,收集了很多无偿分享给需要的人,仅供学习和交流。 ChromeDriver 102.0.5005.61 ChromeDriver 105.0.5195.102 ChromeDriver 108.0.5359.71 ChromeDriver 111.0.5563.64 ChromeDriver 116.0.5845.97 Chrom…...
springboot pagehelper分页插件封装
封装插件: 可自定义返回的Pages实体类参数 package com.wm.common;import com.github.pagehelper.ISelect; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import lombok.Data; import java.util.List;/*** 分页封装* param <…...
Elasticsearch7.1.1 配置密码和SSL证书
生成SSL证书 ./elasticsearch-certutil ca -out config/certs/elastic-certificates.p12 -pass 我这里没有设置ssl证书密码,如果需要设置密码,需要再配置给elasticsearch 在之前的步骤中,如果我们对elastic-certificates.p12 文件配置了密码…...
让win11右键默认显示更多选项
cmd / powershell 右键默认显示更多选项 reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve 刷新,使配置生效(该命令需要cmd执行,powershell不行) …...
毕业项目推荐:基于yolov8/yolo11的100种中药材检测识别系统(python+卷积神经网络)
文章目录 概要一、整体资源介绍技术要点功能展示:功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出(xls格式)功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…...
