背景
Qt界面应用原先运行在内核版本为Linux nvidia 5.10.104-tegra #1 SMP PREEMPT…的Ubuntu20.04系统之上,由于种种原因,需要将该应用移植到内核版本为Linux nvidia 5.10.104-tegra #4 SMP PREEMPT…的Ubuntu20.04之上。期间,两者Qt版本相同,依赖的第三方库也一致,唯一的不同就在于内核的build号。
问题
移植后,界面程序正常启动,QLable显示QImage图片偶现整个控件黑屏;其他界面如果有用到QLayout布局,显示/隐藏布局内控件,偶发控件隐藏不掉或者隐藏掉了,控件所占页面位置还在,期间,如果不加人为干预,需要等5-10s钟左右的时间方能自行刷新。
排查方法
- 通过现象,疑是qt应用程序中使用Layout布局在此系统中会出现刷新问题。遂单独写一demo,使用Layout布局,实现布局内控件显示/隐藏。然卡顿现象未现,显示/隐藏功能皆正常。故排除是Layout布局所致;
- 继续分析问题,疑是项目中出现卡顿页面子控件太多,样式复杂,导致页面刷新不及时。遂将出现问题页面引入测试demo,运行后,控件显示/隐藏亦正常。而后将页面样式皆除,行之亦然。故亦排除控件多、样式繁等因素;
- 缘由大多数页面使用QStackedWidget实现页面切换,切换之时刷新卡顿概率剧增。故重写QStackedWidget,在切换显示后增加QApplication::ProcessEvent(),运行过后,页面切换效果稍好,但QLayout布局内控件的显示/隐藏卡顿依然存在,终归是未解决问题之根本。
- 到此已黔驴技穷,无计可施矣!然问题依旧在,解不掉,许多愁。
- 回归项目本身,写单元测试,将出问题之页面独显,操作控件显示/隐藏,极丝滑…内心陡生思,疑是某一页面创建后致使整个应用刷新异常。
- 重捋项目整体结构,发现除一处Opengl实时刷新图片外,再无可疑之处,遂改Opengl为QLabel,由GPU变CPU刷新,行之,一切页面刷新尽皆如常,内心释然。此刻,只想用“山重水复疑无路,柳暗花明又一村”、“沉舟侧畔千帆过,病树前头万木春”抒发胸中之情。
- 既已找到“病因”,后续对症下药即可,冲浪找资料,网上遇同病之人颇多,皆无根治良方。遂求于NVIDIA厂商,亦递交复现之法,望其后续能有解决之道也。外求之余,得幸于改为QLabel后,对应用本身并无多影响,故暂用此法推进,后续良方亦跟进矣。
总结
一切问题,皆有因果。如果觉得困难,不妨再坚持坚持,答案终会在坚持不懈后出现,历经艰辛过后总会有一种“回首向来萧瑟处,归去,也无风雨也无晴”那般洒脱之感。技术之路,浩瀚如海,吾愿作小舟一芥,长风破浪,直挂云帆。
1万+

被折叠的 条评论
为什么被折叠?



