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

Perfetto学习大全

Perfetto 是一个功能强大的性能分析和追踪工具,主要用于捕获和分析复杂系统中的事件和性能数据,特别是在 Android 和 Linux 环境下。它的核心目标是帮助开发者深入了解系统和应用程序的运行状态,以便优化性能和诊断问题。

Perfetto的主要作用

  1. 系统性能分析
    • 捕获 CPU、GPU、内存、I/O 等方面的性能数据。
    • 帮助分析瓶颈和资源使用情况。
  2. 应用性能分析
    • 追踪应用中特定任务的执行时间,例如函数调用、帧渲染等。
    • 支持用户自定义事件的插桩。
  3. 多进程和跨设备追踪
    • 可以追踪多个进程之间的交互。
    • 支持 Android 设备和其他 Linux 系统上的追踪。
  4. 多样化数据展示
    • 提供可视化界面(Perfetto UI),展示时间线、任务分布、帧率等。
    • 生成可以在 CI/CD 流程中使用的报告。
  5. 替代 Systrace
    • Perfetto 是 Android 平台中传统 Systrace 工具的继任者,提供更高效、更现代的性能分析能力。

Perfetto 的发展历史

起源
  • Perfetto 由 Google 开发,最初作为 Android 平台的一部分,用来补足 Systrace 和其他工具的不足。
  • 它的名字源于意大利语,意为“完美”。
发展历程
  1. 早期阶段(2017-2018 年)
  • 在 Android 开发者工具中引入,作为内部性能分析工具。
  • 随着 Android P(API 级别 28)的推出,开始逐步集成到 Android 平台。
  • 扩展了 Systrace 的功能,并加入了对更多硬件事件的追踪能力。
  1. 成熟阶段(2019 年)
    • Perfetto 成为 Android 官方性能追踪工具,完全取代 Systrace。
    • 提供开放的 API,使开发者可以轻松插入自定义追踪事件。
    • 引入了强大的追踪文件格式(Proto-based)和本地分析支持。
  2. 跨平台扩展(2020 年及之后)
    • 虽然起源于 Android,Perfetto 逐渐支持其他 Linux 平台。
    • 支持嵌入式设备和桌面环境的性能分析。
    • 被集成到更多的 Google 内部工具中,如 Chrome 的追踪系统。
  3. 现代化(2022 年及之后)
    • 提供了完全开源的解决方案,开发者可访问其源码并自定义功能。
    • Web UI 和命令行工具持续优化,提升了数据展示和分析效率。
    • 在 Perfetto UI 中引入了更多直观的分析视图,如 flame graph(火焰图)、内存转储分析等。

Perfetto 的现状

Perfetto 已成为性能分析领域的一个标杆工具,在 Android 和 Linux 社区中有广泛的应用,并不断扩展到更多平台和场景。它以现代化的设计、强大的功能和灵活的 API 支持,满足了从应用程序开发到系统优化的多样化需求。

如何抓取 Perfetto 数据

使用 Perfetto 捕获性能数据,涉及几个步骤:配置追踪、启动捕获、保存数据,并分析结果。以下是详细步骤和方法:

1. 使用 Perfetto UI

Perfetto 提供了基于浏览器的可视化界面,可以直接进行数据捕获和分析。

步骤
  1. 连接设备将 Android 设备通过 USB 连接到开发电脑,并确保开发者模式和 USB 调试已启用。
  2. 打开 Perfetto UI访问 Perfetto UI。
  3. 配置追踪
    • 点击 Record new trace
    • 选择目标设备(需启用 WebUSB)。
    • 配置追踪设置(如 CPU、内存、帧率、GPU 等)。
  4. 启动追踪点击 Start recording 开始追踪。系统会实时收集数据。
  5. 停止追踪并下载数据追踪结束后,点击 Stop tracing,然后下载生成的 .perfetto-trace 文件。
    在这里插入图片描述

2. 使用命令行工具 (ADB)

步骤
  1. 连接设备确保设备通过 USB 连接,并启用了开发者模式。
  2. 推送 Perfetto 配置文件
    使用 adb 将配置文件推送到设备:
adb push config.pbtxt /data/local/tmp/config.pbtxt

配置文件格式为 proto 或文本格式,定义追踪内容。
3. 启动 Perfetto 守护进程
在设备上启动 Perfetto:

adb shell perfetto --txt -c /data/local/tmp/config.pbtxt -o /data/local/tmp/trace_file
- --txt: 指定配置文件是文本格式。
- -c: 配置文件路径。
- -o: 输出文件路径。
  1. 停止追踪
    根据配置文件的 duration_ms(持续时间)自动停止,或手动终止。
  2. 下载追踪文件
    将追踪文件拉取到本地:
adb pull /data/local/tmp/trace_file ./trace_file

3. 使用 Android Studio Profiler

步骤
  1. 打开 Android Studio连接设备并打开要分析的应用项目。
  2. 启动 Profiler
    在 Android Studio 中选择 View > Tool Windows > Profiler
  3. 选择追踪模式
    在 Profiler 界面中选择要捕获的数据类型,例如 CPU、内存或自定义事件。
  4. 开始和停止追踪
    点击 Record 开始追踪,结束时点击 Stop
  5. 导出追踪文件
    在 Profiler 中导出为 .perfetto-trace 文件。

4. 编写自定义代码插桩

Perfetto 支持通过代码插桩收集自定义事件。

示例代码

在应用代码中引入 Perfetto SDK:

import androidx.tracing.Tracefun exampleFunction() {Trace.beginSection("Custom Event")// 执行任务Trace.endSection()
}

通过这种方式,可以记录自定义任务的运行时间,并在 Perfetto 中查看。

5. 分析追踪数据

捕获数据后,可以通过以下方法分析:
- Perfetto UI:将 .perfetto-trace 文件拖入 Perfetto UI 查看。
- 命令行工具:使用 trace_processor_shell 提取统计信息。
- 第三方工具:如火焰图分析工具。

配置文件示例

以下是一个简单的文本配置文件 config.pbtxt

buffers: { size_kb: 10240 }
data_sources: {config {name: "linux.ftrace"ftrace_config {ftrace_events: "sched/sched_switch"ftrace_events: "sched/sched_wakeup"}}
}
duration_ms: 5000
  • 捕获 sched_switch 和 sched_wakeup 事件。
  • 持续 5 秒,使用 10 MB 缓冲区。

如何使用Perfetto分析数据

Perfetto 数据分析的核心是理解数据的来源、使用工具提取信息,并将结果与性能瓶颈或问题对齐。分析主要分为可视化分析和数据挖掘两个部分。

1. 可视化分析 (Perfetto UI)

Perfetto 提供了直观的 Web 界面,可以轻松加载和查看 .perfetto-trace 文件。

步骤
  1. 加载数据打开 Perfetto UI,将 .perfetto-trace 文件拖入页面。
  2. 分析时间线
    • 主线程事件 (Main Thread) 查看主线程的执行情况,包括任务分布、耗时任务、空闲时间等。
    • 渲染帧时间 (Frame Rendering) 检查是否有掉帧或卡顿,分析每一帧的组成部分(如绘制、同步、提交等)。
    • 系统事件 包括 CPU 调度、内存分配、I/O 等系统级别的事件。
    • 自定义事件 如果代码中插入了自定义 Trace,可以在特定区域找到对应事件。
  3. 使用 Perfetto 工具
    Perfetto UI 提供了一些内置工具:
    • Query:使用 SQL 查询数据,提取统计信息。
    • Flame Chart (火焰图):查看函数调用和线程活动。
    • Heap Profiler:分析内存使用和分配热点。
    • Slices:分解任务,显示每个子任务的执行时间。
  4. 标注和导出
    • 可以标记关键点,如性能瓶颈或异常事件。
    • 支持导出分析截图或数据片段供进一步处理。

2. 使用 Trace Processor (命令行工具)

Trace Processor 是 Perfetto 提供的 CLI 工具,用于从 .perfetto-trace 文件中提取和分析数据。

安装 Trace Processor

从 Perfetto 官方页面 下载并安装。

常用命令
  1. 加载追踪文件
trace_processor_shell trace_file.perfetto-trace
  1. 查看支持的表
.tables

输出所有支持的 SQL 表,例如 sched(调度信息)、slice(任务切片)、cpu(CPU 使用情况)等。
3. 示例 SQL 查询

  • CPU 使用率查询 CPU 使用时间最长的线程:
SELECTthread_name,SUM(dur) / 1e6 AS total_time_ms
FROM sched
JOIN thread USING(utid)
GROUP BY thread_name
ORDER BY total_time_ms DESC
LIMIT 10;
  • 主线程分析查找主线程的任务分布:
SELECTname,dur / 1e6 AS duration_ms
FROM slice
WHERE thread_name = 'main'
ORDER BY duration_ms DESC;
  • 内存使用分析内存分配峰值:
SELECTtimestamp / 1e6 AS time_ms,value / 1024 AS memory_kb
FROM counters
WHERE name = 'mem.rss';
  1. 导出分析结果
    查询结果可以通过命令行导出为 CSV 或 JSON 文件:
trace_processor_shell trace_file.perfetto-trace --query=query.sql > output.csv

3. 火焰图 (Flame Graph) 分析

火焰图是 Perfetto 数据分析中的关键工具之一,用于展示函数调用的层级结构和执行时间。

查看火焰图
  1. 在 Perfetto UI 中,找到火焰图选项。
  2. 选择线程或任务,展开火焰图:
    • 每一层表示一个函数调用栈。
    • 宽度表示函数的执行时间。
  3. 寻找宽度异常的大区域,通常是性能瓶颈所在。
    请添加图片描述

4. 常见分析场景

4.1 CPU 密集型问题
  • 在 sched 或 slice 表中,查询线程调度信息。
  • 寻找占用 CPU 时间最长的任务和线程。
4.2 掉帧和渲染卡顿
  • 在 Perfetto UI 的帧时间线上,查找耗时过长的帧。
  • 检查帧中 RenderDrawSubmit 阶段的耗时。
4.3 内存泄漏
  • 使用 Heap Profiler,查找未释放的内存分配。
  • 分析 counters 表中的内存使用模式。
4.4 I/O 延迟
  • 查看 I/O 相关事件,分析是否存在 I/O 瓶颈或阻塞。
  • 在 slice 表中查找 disk 或 file 相关的任务。

工具整合

工具用途优势
Perfetto UI数据可视化和交互分析直观,适合初学者和快速分析
Trace Processor精确数据提取和 SQL 分析灵活,适合复杂场景和自动化流程
火焰图工具函数调用分析,定位瓶颈层级清晰,适合查看任务分布

通过结合以上工具和方法,可以高效地分析 Perfetto 数据,识别性能问题,并进行优化。

参考

Android Perfetto 系列 2:Perfetto Trace 抓取
Android Perfetto Trace性能分析

相关文章:

Perfetto学习大全

Perfetto 是一个功能强大的性能分析和追踪工具,主要用于捕获和分析复杂系统中的事件和性能数据,特别是在 Android 和 Linux 环境下。它的核心目标是帮助开发者深入了解系统和应用程序的运行状态,以便优化性能和诊断问题。 Perfetto的主要作用…...

管家婆财贸ERP BR040.销售单明细表变更

最低适用版本: C系列 23.8 插件简要功能说明: 销售明细表支持直接修改单据自由项1-16更多细节描述见下方详细文档 插件操作视频: 进销存类定制插件--销售单明细表变更 1. 应用中心增加菜单【销售单明细表变更】 a. 复制23.8版本销售单明细…...

2411rust,实现特征

原文 在Rust2024中,impl Trait在中位置的默认工作方式有了变化.是为了简化impl Trait,以更好地匹配人们一般的需求. 还添加了一个灵活的语法,让你需要时可完全控制. 从Rust2024开始,一直在更改,何时可在返回位置impl Trait的隐藏类型中使用泛型参数的规则: 1,即对返回位置i…...

SpringBoot3与JUnit5集成测试

你可以在 Spring Boot 3 中轻松设置和运行 JUnit 集成测试。合理使用 Spring 提供的注解和工具,可以确保测试的高效性和可靠性。以下是集成测试的步骤和示例: 1. 添加依赖 在 pom.xml 中添加 Spring Boot Starter Test 依赖,它包含 JUnit 5 …...

工程企业需要什么样的物资管理系统?为什么需要物资管理系统?

一、背景与意义 在工程项目的建设中,无论是高楼大厦的拔地而起,还是高速公路的绵延铺展,物资都是最基础的要素之一。从钢筋水泥到施工机械,任何一种物资的管理不善都可能导致项目延误、成本超支,甚至质量问题。然而&a…...

Vue + Websocket播放PCM(base64转ArrayBuffer、 字符串转ArrayBuffer)

文章目录 引言I 音视频处理相关概念和APIII 案例:基于开源库 pcm-player方式播放借助MediaSource和Audio对象播放音频流。基于原生api AudioContext 播放操作III 格式转换js字符串转ArrayBufferbase64 转 ArrayBufferIV 解决pcm-player分片播放问题引言 需求: 基于webscoket传…...

华为防火墙技术基本概念学习笔记

1.防火墙概述 1.1防火墙与交换机、路由器对比 路由器与交换机的本质是转发,防火墙的本质是控制。 防火墙与路由器、交换机是有区别的。路由器用来连接不同的网络,通过路由协议保证互联互通,确保将报文转发到目的地;交换机则通常用来组建局域…...

Mesh路由组网

Mesh无线网格网络,多跳(multi-hop)网络,为解决全屋覆盖信号,一般用于家庭网络和小型企业 原理 网关路由器(主路由,连接光猫),Mesh路由器(子路由,…...

【数据结构】七种常用排序总结

一、七种排序及其讲解 以下为七种排序的讲解: 【数据结构】插入排序——直接插入排序 和 希尔排序 【数据结构】选择排序——选择排序 和 堆排序 【数据结构】交换排序——冒泡排序 和 快速排序 【数据结构】归并排序 —— 递归及非递归解决归并排序 二、排序的…...

【在Linux世界中追寻伟大的One Piece】多线程(一)

目录 1 -> Linux线程概念 1.1 -> 什么是线程 1.2 -> 线程的优点 1.3 -> 线程的缺点 1.4 -> 线程异常 1.5 -> 线程用途 2 -> Linux线程 VS 进程 2.1 -> 线程和进程 2.2 -> 进程的多个线程共享 3 -> Linux线程控制 3.1 -> POSIX线程…...

《Python编程实训快速上手》第十天--处理CSV文件和JSON数据

CSV:简化的电子表格,被保存为纯文本文件 JSON:是一种数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,以JavaScript源代码的形式将信息保存在纯文本文件中 一、csv模块 CSV文件中的每行代表电…...

基于springboot停车场管理系统源码和论文

如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统停车场管理系统信息管理难度大,容错率低,…...

Linux的桌面

Linux的桌面是可以卸载的 的确,Linux并不像Windows,Linux本身是一个基于命令行的操作系统,在内核眼中,桌面只不过是个普通的应用程序,所以,在Linux的桌面中可以完成的事情,命令行中也基本可以完…...

Spring Boot 3.0废弃了JavaEE,改用了Jakarta EE

Spring Boot 3.0废弃了JavaEE,改用了Jakarta EE 历史背景 javax变成Jakarta的主要原因是因为Java EE项目从Oracle转移到了Eclipse Foundation,并改名为Jakarta EE。 JavaEE是从Java 1.2版本开始推出的Java企业级开发平台,最初的名称是J2EE(J…...

java-排序算法汇总

排序算法: 冒泡排序(Bubble Sort) 选择排序(Selection Sort) 插入排序(Insertion Sort) 快速排序(Quick Sort) 归并排序(Merge Sort) 堆排序&…...

C0030.Clion中运行提示Process finished with exit code -1073741515 (0xC0000135)解决办法

1.错误提示 2.解决办法 添加环境变量完成之后,重启Clion软件,然后就可以正常调用由mingw编译的opencv库了。...

如何理解JS的 异步

JS是一门单线程的语言,这是因为它运行在浏览器的渲染主线程中,而渲染主线程只有一个。 而渲染主线程承担着诸多的工作,渲染页面、执行JS都在其中运行。 如果使用同步的方式,就极有可能导致主线程产生阻塞,从而导致消…...

vsgithub

VS&GitHub项目联动(上传和克隆),创建你的第一个仓库,小白配置_vs上传代码到github-CSDN博客...

Android蓝牙架构,源文件目录/编译方式学习

Android 版本 发布时间 代号(Codename) Android 1.0 2008年9月23日 无 Android 1.1 2009年2月9日 Petit Four Android 1.5 2009年4月27日 Cupcake Android 1.6 2009年9月15日 Donut Android 2.0 2009年10月26日 Eclair Android 2.1 2…...

10 - Clickhouse集群部署以及副本和分片

目 一、副本 1、简介 2、副本写入流程 3、副本配置步骤 3.1、启动zookeeper集群 3.2、在 hallo100 的/etc/clickhouse-server/config.d 目录下创建一个名为metrika.xml 的配置文件,内容如下: 3.3、在 hallo100 的/etc/clickhouse-server/config.xml 中增加如…...

FreeRTOS的软件定时器与事件标志组

目录 1.FreeRTOS软件定时器 1.1 什么是FreeRTOS软件定时器? 1.2 学习软件定时器的意义 1.3 软件定时器的简介 1.3.1 软件定时器概述 1.3.2 编写回调函数的注意事项 1.4 定时器服务/Daemon 任务 1.4.1 定时器服务任务与队列 1.4.2 定时器相关配置 configUSE_T…...

生产制造领域的多元化模式探索

在当今全球化和信息化的时代背景下,生产制造领域正经历着前所未有的变革。随着消费者需求的多样化、市场竞争的加剧以及技术的不断进步,传统的生产制造模式已经难以满足现代企业的需求。因此,多种生产制造模式应运而生,以适应不同…...

大数据技术之SparkCore

RDD概述 什么是RDD RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象。代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。 RDD五大特性 RDD编程 RDD的创…...

element-plus的组件数据配置化封装 - table

目录 一、封装的table、table-column组件以及相关ts类型的定义 1、ATable组件的封装 - index.ts 2、ATableColumn组件的封装 - ATableColumn.ts 3、ATable、ATableColumn类型 - interface.ts 二、ATable、ATableColumn组件的使用 三、相关属性、方法的使用以及相关说明 1. C…...

蓝桥杯每日真题 - 第15天

题目:(钟表) 题目描述(13届 C&C B组B题) 解题思路: 理解钟表指针的运动: 秒针每分钟转一圈,即每秒转6度。 分针每小时转一圈,即每分钟转6度。 时针每12小时转一圈…...

c#:winform调用bartender实现打印(学习整理笔记)

效果 学习路径 C# winform调用Bartender进行自定义打印、批量打印、检索文件夹中的模板_哔哩哔哩_bilibili 一、初始环境搭建见: c#:winform引入bartender-CSDN博客https://blog.csdn.net/weixin_46001736/article/details/143989473?sharetypeblogdetail&s…...

周期法频率计的设计

目录 周期法频率计 分析: 设计过程: 周期法频率计 对于低频信号,应用周期法进行测频。周期法测频的基本原理是:应用标准频率信号统计被测信号两个相邻脉冲之间的脉冲数,然后通过脉冲数计算出被测信号的周期&#xff…...

【2024亚太杯亚太赛APMCM C题】数学建模竞赛|宠物行业及相关产业的发展分析与策略|建模过程+完整代码论文全解全析

第一个问题是:请基于附件 1 中的数据以及你的团队收集的额外数据,分析过去五年中国宠物行业按宠物类型的发展情况。并分析中国宠物行业发展的因素,预测未来三年中国宠物行业的发展。 第一个问题:分析中国宠物行业按宠物类型的发展…...

uniapp的renderjs使用

‌uniapp中的RenderJS主要服务于APP和H5平台,其作用包括降低逻辑层和视图层的通讯损耗,提供高性能视图交互能力,以及在视图层操作DOM和运行Web的JS库‌。 RenderJS是uni-app中一个特性,它允许开发者在页面中使用JavaScript直接渲…...

CPU命名那些事

一、Intel CPU命名 1. 命名结构 Intel CPU 的命名通常包含以下几个部分: 品牌 产品线 系列 代数 具体型号 后缀 例如:Intel Core i7-13700K 2. 各部分含义 品牌 Intel:表示厂商(几乎所有命名中都有)。不同品…...

【LLM】一文学会SPPO

博客昵称:沈小农学编程 作者简介:一名在读硕士,定期更新相关算法面试题,欢迎关注小弟! PS:哈喽!各位CSDN的uu们,我是你的小弟沈小农,希望我的文章能帮助到你。欢迎大家在…...

鸿蒙多线程开发——线程间数据通信对象03(sendable)

1、简 介 在传统JS引擎上,对象的并发通信开销的优化方式只有一种,就是把实现下沉到Native侧,通过Transferable对象的转移或共享方式降低并发通信开销。而开发者仍然还有大量对象并发通信的诉求,这个问题在业界的JS引擎实现上并没…...

web前端开发--动画效果

1、3D旋转 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>3D旋转</title><style type"text/css">div{/*设置大盒子样式*/width: 100px;height: 100px;/*background-color: rgba(255,0,0,0.5);*/ba…...

【数据分享】中国价格统计年鉴(2013-2024) PDF

数据介绍 犹如一座珍贵的宝库&#xff0c;全面而系统地记录了中国在这一时期的价格变动情况。它涵盖了丰富的内容&#xff0c;包括宏观经济指标、商品价格、居民消费价格以及城市物价监测等多个方面。 在宏观经济指标方面&#xff0c;年鉴中收录了 GDP、CPI、PPI 等重要数据&…...

鸿蒙NEXT开发案例:字数统计

【引言】 本文将通过一个具体的案例——“字数统计”组件&#xff0c;来探讨如何在鸿蒙NEXT框架下实现这一功能。此组件不仅能够统计用户输入文本中的汉字、中文标点、数字、以及英文字符的数量&#xff0c;还具有良好的用户界面设计&#xff0c;使用户能够直观地了解输入文本…...

TritonServer中加载模型,并在Gunicorn上启动Web服务调用模型

TritonServer中加载模型,并在Gunicorn上启动Web服务调用模型 一、TritonServer中加载模型1.1 搭建本地仓库1.2 配置文件1.3 服务端代码1.4 启动TritonServer二、Gunicorn上启动Web服务2.1 安装和配置Gunicorn2.2 启动Gunicorn三、调用模型四、性能优化与监控五、总结在深度学习…...

[UE5学习] 一、使用源代码安装UE5.4

一、简介 本文介绍了如何使用源代码安装编译UE5.4&#xff0c;并且新建简单的项目&#xff0c;打包成安卓平台下的apk安装包。 二、使用源代码安装UE5.4 注意事项&#xff1a; 请保证可以全程流畅地科学上网。请保证C盘具有充足的空间。请保证接下来安装下载的visual studi…...

2023AE软件、Adobe After Effects安装步骤分享教程

2023AE软件是一款由Adobe公司开发的视频编辑软件&#xff0c;也被称为Adobe After Effects。它在广告、电影、电视和网络视频等领域广泛应用&#xff0c;用于制作动态图形、特效、合成和其他视觉效果。该软件支持多种视频和音频文件格式&#xff0c;具有丰富的插件和预设&#…...

Xilinx 7 系列 FPGA的各引脚外围电路接法

Xilinx 7系列FPGA的外围电路接法涉及到多个方面&#xff0c;包括电源引脚、时钟输入引脚、FPGA配置引脚、JTAG调试引脚&#xff0c;以及其他辅助引脚。 本文参考资料&#xff1a; ds180 - 7 Series FPGAs Data Sheet - Overview ds181 - Artix 7 FPGAs Data Sheet - DC and AC…...

【LeetCode热题100】队列+宽搜

这篇博客是关于队列宽搜的几道题&#xff0c;主要包括N叉树的层序遍历、二叉树的锯齿形层序遍历、二叉树最大宽度、在每个数行中找最大值。 class Solution { public:vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> ret;if(!root) …...

<Sqlite><websocket>使用Sqlite与websocket,实现网页端对数据库的【读写增删】操作

前言 本文是在websocket进行通讯的基础,添加数据库进行数据的存储,数据库软件使用的是sqlite。 环境配置 系统:windows 平台:visual studio code 语言:javascript、html 库:nodejs、sqlite 概述 此前,我们实现在利用websocket和socket,将网页端与下位控制器如PLC进行…...

summernote富文本批量上传音频,视频等附件

普通项目,HTML的summernote富文本批量上传音频,视频等附件(其他附件同理) JS和CSS的引入 <head><th:block th:include"include :: summernote-css" /> </head> <body><th:block th:include"include :: summernote-js" /> …...

第六十五周周报 UP2ME

文章目录 week 65 UP2ME摘要Abstract1. 题目2. Abstract3. 文献解读3.1 Introduction3.2 创新点 4. 网络结构4.1 单变量预训练4.1.1 样例生成4.1.2 掩码自动编码器预训练4.1.3 即时反应模式 4.2 多元微调4.2.1 稀疏依赖图构造4.2.2 时域频道层 5. 实验结果6. 结论7. 部分关键代…...

Unity 使用 Excel 进行配置管理(读Excel配置表、Excel转保存Txt 文本、读取保存的 Txt 文本配置内容)

Unity 使用 Excel 进行配置管理(读Excel配置表、Excel转保存Txt 文本、读取保存的 Txt 文本配置内容) 目录 Unity 使用 Excel 进行配置管理(读Excel配置表、Excel转保存Txt 文本、读取保存的 Txt 文本配置内容) 一、简单介绍 二、实现原理 三、注意事项 四、案例简单步…...

【STM32】MPU6050简介

文章目录 MPU6050简介MPU6050关键块带有16位ADC和信号调理的三轴MEMS陀螺仪具有16位ADC和信号调理的三轴MEMS加速度计I2C串行通信接口 MPU6050对应的数据手册&#xff1a;MPU6050 陀螺仪加速度计 链接: https://pan.baidu.com/s/13nwEhGvsfxx0euR2hMHsyw?pwdv2i6 提取码: v2i6…...

学习日记_20241123_聚类方法(MeanShift)

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…...

Qt常用控件 按钮

文章目录 1. QAbstractButton 简介2. QPushButton2.1 例子1&#xff0c;设置按钮的图标2.2 例子2&#xff0c;设置按钮快捷键 3. QRadioButton3.1 介绍3.2 例子1&#xff0c;选择性别3.3 例子2&#xff0c;试试其他的信号3.3 例子3&#xff0c;分组 4. QCheckBox4.1 介绍4.2 例…...

医院信息化与智能化系统(22)

医院信息化与智能化系统(22) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应…...

嵌入式硬件实战基础篇(二)-稳定输出3.3V的太阳能电池-无限充放电

引言&#xff1a;本内容主要用作于学习巩固嵌入式硬件内容知识&#xff0c;用于想提升下述能力&#xff0c;针对学习稳压芯片和电容以及电池之间的运用&#xff0c;对于硬件PCB以及原理图的练习和前面硬件篇的实际运用&#xff1b;太阳能是一种清洁、可再生的能源&#xff0c;广…...

UE5材质篇5 简易水面

不得不说&#xff0c;UE5里搞一个水面实在是相比要自己写各种反射来说太友好了&#xff0c;就主要是开启一堆开关&#xff0c;lumen相关的&#xff0c;然后稍微连一些蓝图就几乎有了 这里要改一个shading model&#xff0c;要这个 然后要增加一个这个node 并且不需要连接base …...