基于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。

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

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

相关文章

Qt:7.QWidget属性介绍(cursor属性-光标形状、font属性-控件文本样式、tooltip属性-控件提示信息)

目录 一、cursor属性-光标形状: 1.1cursor属性介绍: 1.2获取当前光标形状——cursor(): 1.3 设置光标的形状——setCursor(): 1.4 设置自定义图片为光标: 二、font属性-控件文本样式: 2.1font属性介绍…

antd-Table-可视化数据滚动

代码 // 使用方式 const Index () > {useScroll();return <Table />; }import { useEffect, useRef, useState } from react;export const useScroll (() > {let timer;function start() {const [isScroll, setIsScroll] useState(true);const scrollTopRef u…

代码随想录算法训练营Day59|110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长

字符串接龙 110. 字符串接龙 (kamacoder.com) 主要参考代码随想录 代码随想录 (programmercarl.com) 目标&#xff1a;得到从beginStr转变为endStr所需的最少步数 过程&#xff1a;每次变换一个字母&#xff0c;每次变换的结果要在strList中。 对于一个图来说&#xff0c;…

excel批量修改一列单价的金额并保留1位小数

1.打开表格&#xff0c;要把单价金额变成现在的两倍&#xff0c;数据如下&#xff1a; 2.把单价这一列粘贴到一个新的sheet页面&#xff0c;在B2单元格输入公式&#xff1a;A2*2 然后按enter回车键,这时候吧鼠标放到B2单元格右下角&#xff0c;会出现一个黑色的小加号&#xf…

重大更新来袭!!《植物大战僵尸杂交版V2.1+修改器+融合版》

大家好&#xff01;每个软件更新总是令人兴奋不已。前段时间介绍的《植物大战僵尸》系列以其独特的策略玩法和丰富的植物角色&#xff0c;赢得了很多玩家的喜爱。而在今天&#xff0c;这款经典游戏全网最新版本——《植物大战僵尸&#xff1a;杂交版V2.1》正式推出&#xff0c;…

docker 环境下failed to start lsb故障解决

背景&#xff1a;从深信服超融合迁移虚拟机到VMWARE集群后&#xff0c;迁移后的虚拟机 centos 7 运行systemctl start network ,报错 Restarting network (via systemctl): Job for network.service failed. See systemctl status network.service and journalctl -xn for d…

Redis组建哨兵模式

主172.17.60.131 从172.17.60.130、172.17.60.129 redis部署 [rootlocalhost app]# tar xf redis-6.2.9.tar.gz [rootlocalhost app]# cd redis-6.2.9/ [rootlocalhost redis-6.2.9]# make MALLOClibc [rootlocalhost redis-6.2.9]# make install PREFIX/usr/local/redis…

Docker 中查看及修改 Redis 容器密码的实用指南

在使用 Docker 部署 Redis 容器时&#xff0c;有时我们需要查看或修改 Redis 的密码。本文将详细介绍如何在 Docker 中查看和修改 Redis 容器的密码&#xff0c;帮助你更好地管理和维护你的 Redis 实例。 一、查看 Redis 容器密码 通常在启动 Redis 容器时&#xff0c;我们会…

构建LangChain应用程序的示例代码:56、如何实现一个多智能体模拟,其中没有固定的发言顺序。智能体自行决定谁来发言,通过竞价机制实现

多智能体分散式发言人选择 示例展示了如何实现一个多智能体模拟,其中没有固定的发言顺序。智能体自行决定谁来发言,通过竞价机制实现。 我们将在下面的示例中展示一场虚构的总统辩论来演示这一过程。 导入LangChain相关模块 from typing import Callable, Listimport tenac…

正向代理反向代理

nginx的正向代理和反向代理: 正向代理以及缓存配置: 代理:客户端不再是直接访问服务端&#xff0c;通过代理服务器访问服务端。 正向代理&#xff1a;面向客户端&#xff0c;通过代理服务器的ip地址访问目标服务端 服务端只知道代理服务器的地址&#xff0c;真正的客户端ip可以…

【MySQL系列】隐式转换

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

ctfshow web入门 nodejs

web334 有个文件下载之后改后缀为zip加压就可以得到两个文件 一个文件类似于index.php 还有一个就是登录密码登录成功就有flag username:ctfshow password:123456因为 return name!CTFSHOW && item.username name.toUpperCase() && item.password passwor…

产科管理系统 专科电子病历系统源码,前后端分离架构,多家医院产科广泛运用,系统稳定,功能齐全

产科管理系统 专科电子病历系统源码&#xff0c;前后端分离架构&#xff0c;多家医院产科广泛运用&#xff0c;系统稳定&#xff0c;功能齐全 产科管理系统&#xff0c;特别是产科信息管理系统&#xff08;Obstetrical Information Management System&#xff0c;简称OIMS&…

智能井盖监测系统:守护城市安全的新防线

​ ​​在快速发展的现代都市中&#xff0c;井盖作为连接地上与地下世界的“隐形门”&#xff0c;其安全状态直接关系到市民的生命财产安全。随着物联网、大数据及人工智能技术的飞速发展&#xff0c;智能井盖监测系统的出现为解决传统井盖管理难题提供了创新方案&#xff0…

【算法笔记自学】入门篇(2)——算法初步

4.1排序 自己写的题解 #include <stdio.h> #include <stdlib.h>void selectSort(int A[], int n) {for(int i 0; i < n - 1; i) { // 修正索引范围int k i;for(int j i 1; j < n; j) { // 修正索引范围if(A[j] < A[k]) {k j;}}if (k ! i) { // 仅在…

跨境人最怕的封店要怎么规避?

跨境人最怕的是什么&#xff1f;——封店 造成封店的原因很多&#xff0c;IP关联、无版权售卖、虚假发货等等&#xff0c;其中IP关联这个问题导致店铺被封在跨境商家中简直是屡见不鲜 IP关联&#xff0c;是指被海外平台检测到多家店铺开设在同一个站点上的情况。我们知道有些…

卖家必读:阿里巴巴国际站登录与入驻全流程

阿里巴巴国际站作为全球最大的B2B电子商务平台之一&#xff0c;为品牌建立和业务拓展提供了可能。那么跨境卖家如何才能成功登录和入驻阿里巴巴国际站&#xff1f;本文将讲解如何用阿里巴巴国际站网页版进行登录&#xff0c;以及阿里巴巴国际站卖家的入驻条件、流程和费用。此外…

统计信号处理基础 习题解答11-12

题目 证明 的MAP估计量为 其中是一个的矢量, 是一个可逆的p*p的矩阵。也就是说&#xff0c;MAP估计量对可逆的线性变换是可以变换的。 解答 已知的联合概率密度 且&#xff1a; 现在知道&#xff1a; 那么为了获得变换后的MAP&#xff0c;首先需要根据求出 根据概率密度变换…

2024年软件测试面试题,精选100+,附答案+文档

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Part1 1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我…

C++入门 容器适配器 / stack queue模拟实现

目录 容器适配器 deque的原理介绍 stack模拟实现 queue模拟实现 priority_queue模拟实现 仿函数 容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总 结)&#xff0c;该种模式是将一个类的接口转换成客户希望…