嵌入式Qt页面卡顿

嵌入式Qt页面卡顿

近期在写一个嵌入式设备运行的Qt应用程序时,在本地开发机上运行很正常,但是拷贝到设备端运行就会特别卡顿。切换页面有时要等2s才能切过去。虽然最后发现原因很简单,但是整个过程还是很有意思的,这里记录一下分析问题的过程。

背景

产品是基于厂家提供的软件进行的二次开发,对UI和功能进行了优化和补充。发现卡顿后,第一时间对比了厂家原始软件,发现并不卡顿,点击页面切换时非常流畅。

因此确认是二次开发后引出的问题。

性能

最开始怀疑是嵌入式设备性能问题,查看了下设备端配置。

  • 操作系统:Window10 32位
  • CPU:Intel Celeron J1900 2.0GHz
  • 核心:4核4线程
  • DDR:2GB
  • 磁盘:30GB

整体看,虽然比起正常办公电脑配置差一半以上,但是作为工控机,只需运行一个应用程序来说,应该还是绰绰有余的。
顺便看了下单纯运行win10系统时,cpu占用率:3%,内存占用率:42%。
运行工控软件后,cpu占用率:28%,内存占用率:47%。
点击页面切换卡顿时:cpu占用率:28%,内存占用率:46%。

运行环境性能状态
运行Win10cpu占用率:3%,内存占用率:42%
+运行工控软件cpu占用率:28%,内存占用率:47%
+切换页面卡顿时cpu占用率:28%,内存占用率:46%

分析:
卡顿时,CPU占用率都没有超过50%,内存使用率也OK,不应该是系统性能到达峰值引起。

结论:
非设备性能问题。

代码层面

既然排除了设备性能的问题,那就确定是新加入的代码引起的。
整理了一下新加的可能引起界面渲染速度慢的点:

  1. 使用了过多的私有样式,在.ui文件中,在代码中。
  2. 设备100ms会刷新一次数据,同时更新UI
  3. 各个包含UI的类中,showEvent事件做了比较多的逻辑。可能导致最终show的速度慢
  4. 通过QGraphicsDropShadowEffect 设置了控件边框阴影

分析1:根据以往项目经验,设置私有样式表是很常见的操作。虽然子控件的样式变化,也会一层层使得父控件的窗口重绘,但是往期从没见过这么明显的卡顿。
分析2:100ms间隔对于CPU来说已经是非常久了,可能性不算很大。暂时先不处理此事件。
分析3:有较大可能。不使用所有的showEvent()事件。
分析4:过去没有使用过此类来设置阴影,直觉可能性不大。但是还是先注释掉。

真相浮出

以上4点都处理之后,我的软件已经变得面目全非了。满怀期待跑起来,切换页面,唰跳转,简直迅雷不及掩耳盗铃0_o。
确认了卡顿的真正原因就隐藏在上面4点中后那就好办了——控制变量法。

原来根本原因是4——QGraphicsDropShadowEffect 设置阴影,因为QSS是基于CSS2的,默认不带box-shadow属性,所有设置阴影目前只找到这一种办法(如果大佬们有其他办法可以指导一二)。

根据Qt文档介绍:

QGraphicsDropShadowEffect类在Qt 4.6版本提供,主要用来渲染出阴影效果。使用
setColor()函数修改投影的颜色,使用setOffset()函数修改投影偏移,使用setBlurRadius()函数更改投影的模糊半径。
默认情况下,投影是半透明的深灰色QColor(63,63,63,180)阴影,半径为1,偏移量为右下8px。投影偏移量在设备坐标中指定。

查看Qt文档也没有提醒用户此方法会对UI显示有这么大影响,可能还是需要研究具体实现的代码。暂时此问题先利用贴图的办法解决,关于使用QGraphicsDropShadowEffect 卡顿的深层原因后面有时间再分析源码。

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值