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

基于MCU平台的HMI开发的性能优化与实战(下)

继上篇《基于MCU平台的HMI开发的性能优化与实战(上)》深入探讨了提升MCU平台HMI开发效率和应用性能的策略后,本文将专注于NXP i.MX RT1170 MCU平台的仪表盘开发实践。我们将重点介绍Qt for MCUs的优化技巧,展示如何通过实际案例应用这些策略,以实现高效且性能卓越的HMI解决方案。

NXP的i.MX RT1170是一款高性能双核MCU,集成1GHz Arm Cortex-M7和400MHz Cortex-M4内核,提供2MB SRAM和高级安全功能。它支持多种媒体功能和实时性能,适用于消费电子、工业和汽车应用。

上图展示的HMI仪表设计图融入了丰富元素,如实时速度、导航、车辆与电池状态,以及伪3D效果、动态车道线和多图层图像叠加等。这些设计在MCU平台上的精确实现,对HMI的高保真呈现构成了挑战。

我们将深入探讨这一设计在实际开发中的应用策略。通过实施9项关键优化,显著降低了资源消耗并增强了程序性能,确保了MCU平台上动画的流畅性,从而提升了用户体验。

  • 复用一个Text文本框达到多个Text的显示效果

UI设计中有许多文字部分,比如说像上图所示的能耗部分的文字显示,从常规思维来说 “XXX km”、“XXX wh/km”和“XX.X Kmh”三部分因为数字和单位的文字大小不一样,通常会用6个Text元素实现,但是会增加文本布局的计算开销,因此我们复用一个Text文本框以达到和多个Text相同的显示效果,避免多次针对文本的布局计算。

  •  烘焙素材,考虑素材之间的层叠关系

 在HMI开发中,为避免速度表动画因多图叠加导致的性能问题,我们优化了素材的层叠处理。原先通过五张图叠加实现的动效,因频繁像素计算而造成动画卡顿。我们对方案进行了改进,将指针、内外光晕合并为一张图,并仅使用上半部分。通过调整旋转中心,实现指针转动效果,这样既减少了图像处理的计算量,也降低了素材数量,有效节约了资源,提升了动画流畅度。

  • 图片素材优化

UI设计给出的图片资源中有些图片规格很大,然而并不是整张图片的内容都会被用到,但是没有用到的图片内容在运行时也进行了像素计算,这部分计算就是多余的资源开销,此时我们就需要对图片进行剪切,将不需要的图片内容剪裁掉,避免资源浪费。

  • 降低图片编码渲染格式

在UI设计中,我们根据图片的像素精细度需求,为它们分配了不同的编码渲染格式。例如,对于像素要求较低的纯色图像,我们采用ARGB4444格式;而对于细节丰富、色彩复杂的图像,则使用ARGB8888格式以保证质量。更多细节,请参考上一期的详细解析。

  •  使用PathSVG来替代部分图片

 PathSVG 是一个 SVG (Scalable Vector Graphics) 文件中的元素,通常用于定义矢量图形的路径。SVG 是一种基于 XML 的文件格式,用于描述二维矢量图形。Path 元素是其中最重要和最常用的元素之一,可以用来绘制任意形状的路径,如直线、曲线和复杂的多边形。如上图所示为能耗突变的矩形框,我们可以使用PathSVG绘制矩形框,使用Gradient实现矩形框内颜色渐变,减少了图片渲染。

  •  数字动画替代Timer

 仪表界面上有许多数值是随着时间变化而不断变化的,通常我们会绑定value,通过调用Timer不断改变value的数值,实现界面数据变化,但当Timer正在运行且其属性之一发生更改时,经过的时间会被重置,发生“脏事件”检查,占用大量CPU,所以我们使用NumberAnimation代替Timer,增加运行性能。

  • 优化Text写法

如下表所示,优化前相当于在设置字体相关属性之前先使用了一个Qt.font对象,随后又对其进行数值修改,优化后相当于直接构建一个自定义的Qt.font对象。这样的操作减少了多余的计算开销,在同时存在多个Text而且Text属性需时刻相同时效果尤为明显。

  • 编译器优化

编译器优化是一个复杂的领域,它使用了一系列的技术和策略,可以在保持程序语义不变的情况下,提高程序的运行速度并减小可执行文件的大小。同时编译器提供多个优化级别,允许开发人员在性能和可维护性之间进行权衡,例如,GCC和Clang等编译器提供了如下的优化级别:

  1. O0:无优化,默认的优化级别,编译器不执行任何优化。
  2. O1:基本优化,执行一些基本的优化操作,如删除未使用的变量、内联简单函数等。
  3. O2:中级优化,进行了更多的优化操作,包括更大范围的内联、循环展开、函数调用图优化等。
  4. O3:高级优化,进行了更深入的优化操作,如更大范围的内联、循环变形、自动向量化等。

在MCU仪表的开发中,我们采用Ofast编译模式以确保程序运行效率最大化。Ofast模式通过结合-O3和-ffast-math的优化特性,提供了一种极端的优化设置。这种设置能够充分利用CPU的多核和向量化指令集等硬件特性,显著提升程序的执行速度。尽管使用这种模式会增加程序的编译时间,但为了性能考虑这种取舍是必要的。

  • 启用图片资源压缩

当处理图片显示时,MCU会先将图片数据从外部ROM复制到外部RAM,经过缩放、旋转等处理后复制到图像缓冲区中,其中外部ROM->外部RAM的步骤会消耗大量的运行时间,影响程序运行速度,为解决此问题,我们配置了以下三个参数:

resourceCachePolicy

配置resourceCachePolicy: “OnDemand”启用图像缓存,此时,图像在首次加载并使用后,并不会立刻被释放,而是保存在一个专门的缓存空间内,在下次使用时将直接从缓存中拿取,避免了重复加载图像带来的时间开销。

maxResourceCacheSize

设置maxResourceCacheSize: xxxxxxxx可配置最大缓存空间。

resourceCompression

配置resourceCompression: true则可以启用对图像的资源压缩,尽可能的减小图像体积,节省外部ROM空间。

应用这些优化策略后,我们能够在NXP1170平台上高效地实现并流畅运行UI设计。

若您希望获取完整的Demo源代码或深入了解Qt for MCUs,请随时联系我们或将需求发送至market@dotrustech.com。

相关文章:

基于MCU平台的HMI开发的性能优化与实战(下)

继上篇《基于MCU平台的HMI开发的性能优化与实战(上)》深入探讨了提升MCU平台HMI开发效率和应用性能的策略后,本文将专注于NXP i.MX RT1170 MCU平台的仪表盘开发实践。我们将重点介绍Qt for MCUs的优化技巧,展示如何通过实际案例应…...

评估测试用例有效性 5个方面

评估测试用例的有效性是确保软件测试活动能够达到预期目标的关键步骤,有助于测试团队优化测试计划,提高测试效率,减少返工,节省成本。如果缺乏对测试用例的有效性评估,可能会导致测试用例无法覆盖关键功能点&#xff0…...

CentOS 7.9 快速更换 阿里云源教程

CentOS 7.9 更换源教程 总结 # 下载 wget yum -y install wget # 备份 yum 源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak # 下载阿里云的yum源到 /etc/yum.repos.d/ # 此处以 CentOS 7 为例,如果是其它版本或者系统的话&#…...

Python 编程快速上手——让繁琐工作自动化(第2版)读书笔记01 Python基础快速过关

Python 编程快速上手——让繁琐工作自动化(第2版)读书笔记01 Python基础快速过关 1 python基础概念 Python提供了高效的高级数据结构,还能简单有效地面向对象编程。 python运算符顺序 **——%——//——/——*——-——python中常见的数据…...

实战 | YOLOv8使用TensorRT加速推理教程(步骤 + 代码)

导 读 本文主要介绍如何使用TensorRT加速YOLOv8模型推理的详细步骤与演示。 YOLOv8推理加速的方法有哪些? YOLOv8模型推理加速可以通过多种技术和方法实现,下面是一些主要的策略: 1. 模型结构优化 网络剪枝:移除模型中不重要的神经元或连接,减少模型复杂度。 模型精…...

绝区陆--大语言模型的幻觉问题是如何推动科学创新

介绍 大型语言模型 (LLM)(例如 GPT-4、LLaMA-2、PaLM-2、Claude-2 等)已展示出为各种应用生成类似人类文本的出色能力。然而,LLM 的一个鲜为人知的方面是它们倾向于“产生幻觉”或生成不正确或没有根据的事实陈述。我不认为这仅仅是一个限制…...

集训 Day 2 模拟赛总结

复盘 7:30 开题 想到几天前被普及组难度模拟赛支配的恐惧,下意识觉得题目很难 先看 T1,好像不是很难,魔改 Kruskal 应该就行 看 T2 ,感觉很神奇,看到多串匹配想到 AC 自动机,又想了想 NOIP …...

Linux系统(CentOS)安装Mysql5.7.x

安装准备: Linux系统(CentOS)添加防火墙、iptables的安装和配置 请访问地址:https://blog.csdn.net/esqabc/article/details/140209894 1,下载mysql安装文件(mysql-5.7.44为例) 选择Linux通用版本64位(L…...

YModem在Android上的实现

(一)参考文献 【安卓相关】蓝牙基于Ymodem协议发送bin文件,对硬件设备进行升级。 - 简书当Android BLE遇上YModem - 简书 (二)收发机制 基于我们具体的需求,在原有的基础上加了一下前后的处理。 * MY YMO…...

循环练习题

代码&#xff1a; public static void main(String[] args) { for (char c1a;c1<z;c1){System.out.print(" "c1); }System.out.println();for (char c2Z;c2>A;c2--){System.out.print(" "c2);}} 结果为&#xff1a;...

Seata解决分布式事务

我举的例子是&#xff1a;在网上购物时&#xff0c;我们支付后&#xff0c;订单微服务会更新订单状态&#xff0c;同时会远程调用购物车微服务清空购物车&#xff0c;和调用商品微服务完成商品库存减一。 我们曾经说的事务是只能在本微服务完成回滚&#xff0c;意思就是如果过…...

C语言编译报错error: expected specifier-qualifier-list before

C语言编译报错 error: storage class specified for parameter error: expected specifier-qualifier-list before 原因&#xff1a; 报错信息 "expected specifier-qualifier-list" 通常表示编译器期望在某个地方出现类型指定列表&#xff0c;但却没有找到。这通常…...

无缝协作:如何实现VMware与Ubuntu虚拟机的剪切板共享!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 剪贴板共享 📒📝 VMware设置📝 安装VMware Tools或open-vm-tools📝 验证剪贴板共享功能⚓️ 相关链接 🚓️📖 介绍 📖 无缝的剪贴板共享是提高工作效率的关键。在VMware和Ubuntu虚拟机的协同工作中,能够直接在宿…...

linux 进程堆栈分析

1.进程pid jsp -l | grep appName 或 ps -ef | grep appName 2.查看cpu top -c pidps -mp pid-o THREAD,tid,time / top -H -p pid #打印出进程对应的线程id及运行时间timeprintf %x\n 线程id3.查看gc jstat -gcutil | grep pid 500jstat -class pid4.查看进程日志 jsta…...

【续集】Java之父的退休之旅:从软件殿堂到多彩人生的探索

Java之父的退休之旅&#xff1a;从软件殿堂到多彩人生的探索-CSDN博客 四、科技领袖退休后的行业影响 4.1 传承与启迪 Gosling等科技领袖的退休&#xff0c;为行业内部年轻一代提供了更多的发展机会和成长空间。他们的退休不仅意味着权力和责任的交接&#xff0c;更是一种精…...

LVS+Nginx高可用集群---Nginx进阶与实战

1.Nginx中解决跨域问题 两个站点的域名不一样&#xff0c;就会有一个跨域问题。 跨域问题&#xff1a;了解同源策略&#xff1a;协议&#xff0c;域名&#xff0c;端口号都相同&#xff0c;只要有一个不相同那么就是非同源。 CORS全称Cross-Origin Resource Sharing&#xff…...

Appium环境搭建,华为nova8鸿蒙系统(包括环境安装,环境配置)(一)

1.安装代码工具包 appium python client pip install appium-python-client 2.安装JDK 参考链接&#xff1a; antjmeterjenkins从0实现持续集成&#xff08;Windows&#xff09;-CSDN博客 3.下载并安卓SDK 下载地址&#xff1a;AndroidDevTools - Android开发工具 Android…...

【React】React18 Hooks 之 useReducer

目录 useReducer案例1&#xff1a;useReducer不带初始化函数案例2&#xff1a;useReducer带初始化函数注意事项1&#xff1a;dispatch函数不会改变正在运行的代码的状态注意事项2&#xff1a;获取dispatch函数触发后 JavaScript 变量的值注意事项3&#xff1a;触发了reducer&am…...

【cocos creator】2.4.x实现简单3d功能,点击选中,旋转,材质修改,透明材质

demo下载:(待审核) https://download.csdn.net/download/K86338236/89527924 const {ccclass, property } = cc._decorator;const enum box_color {NORMAL = 0,DASHED_LINE = 1,//虚线TRANSLUCENT = 2,//半透明 }@ccclass export default class main extends cc.Component {…...

Android EditText+ListPopupWindow实现可编辑的下拉列表

Android EditTextListPopupWindow实现可编辑的下拉列表 &#x1f4d6;1. 可编辑的下拉列表✅步骤一&#xff1a;准备视图✅步骤二&#xff1a;封装显示方法✅步骤三&#xff1a;获取视图并监听 &#x1f4d6;2. 扩展上下箭头✅步骤一&#xff1a;准备上下箭头icon图标✅步骤二&…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...