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

LVGL - RV1109 LVGL UI刷新效率优化-02

说明

前面好早写过一个文章,说明如何把LVGL移到RV1109上的操作,使用DRM方式!但出现刷新效率不高的问题!

因为一直没有真正的应用在产品中,所以也就放下了!

最近开发上需要考虑低成本,低内存的方案,所以后续考虑使用LVGL上来做UI,所以这里捡回来再炒一次!

性能分析

这里还是使用的LV_DEMO中的lv_demo_benchmark来测试的!
代码见前一相关的文:LVGL - RV1109 LVGL UI开发-01

先找到了为什么刷新FPS如此低的原因,主要耗时花在了:

	lvgl_drm_flush->display_commit_ex->drm_commit_ex->drmCommit

上面!

这样导致UI的线程绘图也很慢!

解决方式

最开始想使用双缓存的方式来提交,但看代码drmCommit是整屏修改提交的!不过对drm里的这个commit底层操作还是不太了解!
还是把耗时的这个操作分开操作!使用另一个线程来commit,这样只要在另一个线程中,如是UI线程有调用lvgl_drm_flush 这个后,发送一个消息通知刷新线程drm commit操即可!

代码修改很简单,在 drm_commit_ex 中使用一个mutex和cond来通知另一个线程:

#ifdef DRM_COMMIT_THREADprintf("commit request!!!!!!!!!!!\n");pthread_mutex_lock(&g_commit_mutex);pthread_cond_broadcast(&g_commit_cond);pthread_mutex_unlock(&g_commit_mutex);
#elseret = drmCommit(&disp->buf[num], disp->width, disp->height, 0, 0, &disp->dev, disp->plane_type);if (ret) {fprintf(stderr, "display commit error, ret = %d\n", ret);}
#endif

这里用了一个宏 DRM_COMMIT_THREAD 来控制!

在另一个线程中主要处理如下,即把drmCommit动作放在这里来操作:

#ifdef DRM_COMMIT_THREAD
void* dsiplay_commit_thread_process(void* data)
{int ret = 0;while(g_commit_thread_start_flag){pthread_mutex_lock(&g_commit_mutex);pthread_cond_wait(&g_commit_cond, &g_commit_mutex);pthread_mutex_unlock(&g_commit_mutex);//printf("dsiplay_commit_thread_process!!!!!!............\n");ret = drmCommit(&g_disp.buf[g_num], g_disp.width, g_disp.height, 0, 0, &g_disp.dev, g_disp.plane_type);if (ret) {fprintf(stderr, "display commit error, ret = %d\n", ret);}usleep(1000 * 40);}
}int display_commit_thread_start()
{int ret = 0;pthread_t pid = 0;pthread_attr_t attr;ret = pthread_attr_init(&attr);if(ret != 0){printf("start pthread_attr_init failure!!!\n");return -1;}ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);if(ret != 0){pthread_attr_destroy(&attr);printf( "pthread_attr_setdetachstate PTHREAD_CREATE_DETACHED failure!!!\n");return -1;}ret = pthread_create(&pid, &attr, dsiplay_commit_thread_process, NULL);if(ret == 0){printf(" pthread_create OK! \n");}else{printf(" pthread_create failure!! \n");pthread_attr_destroy(&attr);return -1;}pthread_attr_destroy(&attr);return 0;
}
#endif

性能表现

下面是 lv_demo_widgets 的统计数据:

lv_demo_widgets示例数据

FPS统计方式:

FPS统计方式,这里统计drmCommit花费的时间,看一定时长里能提交多少次:

  ts = _clockTime_getCurrentMscTime();ret = drmCommit(&g_disp.buf[g_num], g_disp.width, g_disp.height, 0, 0, &g_disp.dev, g_disp.plane_type);if (ret) {fprintf(stderr, "display commit error, ret = %d\n", ret);}commit_count++;//usleep(1000 * 40);commit_count_cost_time += _clockTime_checkLostMscTime(ts);if(commit_count >= 64 || commit_count_cost_time > 1000 * 30){int fps = commit_count / (commit_count_cost_time / 1000.0);printf("FPS:%d\n", fps);commit_count = 0;commit_count_cost_time = 0;    }}	
FPS打印统计:
FPS:81
FPS:86
FPS:77
FPS:80
FPS:79
FPS:83
FPS:76
FPS:77
FPS:93
FPS:82
FPS:83
FPS:72
FPS:82
FPS:80
FPS:80
CPU占用
top - 15:57:46 up  6:57,  2 users,  load average: 1.40, 0.84, 0.85
Tasks: 106 total,   3 running,  46 sleeping,   1 stopped,   0 zombie
%Cpu0  :   3.0/21.8   25[|||||||||||||||||||||||||                                                                           ]
%Cpu1  :  25.7/23.8   50[||||||||||||||||||||||||||||||||||||||||||||||||||                                                  ]
GiB Mem :  7.9/0.876    [                                                                                                    ]
GiB Swap:  0.0/0.000    [                                                                                                    ]PID USER      PR  NI    VIRT    RES  %CPU %MEM     TIME+ S COMMAND                                                                                                                               1 root      20   0    2.0m   0.2m   0.0  0.0   0:00.51 S init                                                                                                                                  102 root      20   0    2.0m   0.2m   0.0  0.0   0:00.05 S  `- syslogd                                                                                                                           105 root      20   0    2.0m   0.2m   0.0  0.0   0:00.04 S  `- klogd                                                                                                                             

lv_demo_benchmark统计数据:

FPS打印统计
Result of FPS:47
FPS:80
Result of FPS:40
FPS:78
Result of FPS:46
FPS:74
Result of FPS:40
FPS:74
Result of FPS:42
FPS:83
Result of FPS:28
FPS:79
Result of FPS:50
Result of FPS:51
FPS:77
Result of FPS:48
FPS:77
Result of FPS:47
FPS:73
Result of FPS:42
FPS:75
Result of FPS:41
FPS:79
Result of FPS:49
FPS:75
Result of FPS:51
FPS:77
Result of FPS:50
FPS:78
Result of FPS:50
Result of FPS:50
FPS:80
Result of FPS:48
FPS:76
CPU占用
top - 16:03:47 up  7:03,  2 users,  load average: 2.10, 1.93, 1.38
Tasks: 107 total,   2 running,  45 sleeping,   1 stopped,   0 zombie
%Cpu0  :   1.0/11.8   13[|||||||||||||                                                                                       ]
%Cpu1  :  68.6/16.7   85[||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||              ]
GiB Mem :  7.8/0.876    [                                                                                                    ]
GiB Swap:  0.0/0.000    [                                                                                                    ]PID USER      PR  NI    VIRT    RES  %CPU %MEM     TIME+ S COMMAND                                                                                                                               1 root      20   0    2.0m   0.2m   0.0  0.0   0:00.51 S init                                                                                                                                  102 root      20   0    2.0m   0.2m   0.0  0.0   0:00.05 S  `- syslogd                                                                                                                           105 root      20   0    2.0m   0.2m   0.0  0.0   0:00.04 S  `- klogd                                                                                                                             120 root      20   0    2.7m   1.9m   0.0  0.2   0:00.22 S  `- udevd                                                                                                                             573 root      20   0    1.9m   0.1m   0.0  0.0   0:00.00 S  `- dropbear                                                                                                                          1113 root      20   0    2.3m   1.6m   0.0  0.2   0:12.49 S      `- dropbear                                                                                                                      1114 root      20   0    2.0m   1.5m   0.0  0.2   0:00.01 S          `- sh                                                                                                                        1189 root      20   0    2.8m   1.6m   0.0  0.2   0:28.82 T              `- top                                                                                                                   1220 root      20   0    2.8m   1.6m   1.9  0.2   0:07.22 R              `- top                                                                                                                   628 root      20   0    1.4m   0.1m   0.0  0.0   0:00.00 S  `- input-event-dae                                                                                                                   851 root      20   0    2.0m   0.3m   0.0  0.0   0:00.02 S  `- login                                                                                                                             852 root      20   0    2.0m   1.6m   0.0  0.2   0:00.62 S      `- sh                                                                                                                            893 root      20   0    1.4m   0.2m   0.0  0.0   0:00.32 S          `- wdt_deamon                                                                                                                1225 root      20   0   39.4m  14.7m  84.5  1.6   0:25.70 R          `- pupa_face                                                                                                                 2 root      20   0    0.0m   0.0m   0.0  0.0   0:00.03 S kthreadd                                                                                                                              3 root       0 -20    0.0m   0.0m   0.0  0.0   0:00.00 I  `- rcu_gp                                                                                                                            4 root       0 -20    0.0m   0.0m   0.0  0.0   0:00.00 I  `- rcu_par_gp                                                                                                                        8 root       0 -20    0.0m   0.0m   0.0  0.0   0:00.00 I  `- mm_percpu_wq                                                                                                                      9 root      20   0    0.0m   0.0m   0.0  0.0   0:01.78 S  `- ksoftirqd/0                                                                                                                       10 root      20   0    0.0m   0.0m   0.0  0.0   1:17.11 I  `- rcu_preempt                                                                                                                       11 root      20   0    0.0m   0.0m   0.0  0.0   0:00.00 I  `- rcu_sched                                                                                                                         12 root      20   0    0.0m   0.0m   0.0  0.0   0:00.00 I  `- rcu_bh                                                                                                                            13 root      rt   0    0.0m   0.0m   0.0  0.0   0:00.11 S  `- migration/0                                                                                                                       14 root      20   0    0.0m   0.0m   0.0  0.0   0:00.00 S  `- cpuhp/0                                                                                                                           15 root      20   0    0.0m   0.0m   0.0  0.0   0:00.00 S  `- cpuhp/1                                                                                                                           16 root      rt   0    0.0m   0.0m   0.0  0.0   0:00.02 S  `- migration/1       

分开线程处理后,刷新率立即就上来了,UI线程的FPS在跑 lv_demo_benchmark时,平均commit可以跑到70FPS.

CPU占用率上,不过明显的上升了,使用单线程方式时,CPU占用率在只在5%上下,使用多线程方式时,CPU平均在15%左右,连续操作甚至50%以上!
所以还是还是需要控制一下FPS,这里在dsiplay_commit_thread_process加一个usleep操作.

在跑lv_demo_widgets这个示例时,第二个tab页的 Analytics 界面,能看到仪表盘的每一秒的跳动了,之前的代码是直接跳秒的。

加usleep控制一下刷新

FPS打印统计
FPS:24
Result of FPS:40
Result of FPS:37
Result of FPS:38
FPS:24
Result of FPS:33
Result of FPS:25
Result of FPS:25
FPS:24
Result of FPS:25
Result of FPS:23
Result of FPS:35
FPS:24
Result of FPS:26
Result of FPS:29
Result of FPS:25
Result of FPS:29
FPS:24
Result of FPS:24
Result of FPS:21
Result of FPS:16
FPS:24
CPU占用
top - 16:17:17 up  7:16,  2 users,  load average: 1.08, 0.66, 0.86
Tasks: 106 total,   1 running,  46 sleeping,   1 stopped,   0 zombie
%Cpu(s):  21.3/19.3   41[||||||||||||||||||||||||||||||||||||||||                                                            ]
GiB Mem :  7.8/0.876    [                                                                                                    ]
GiB Swap:  0.0/0.000    [                                                                                                    ]PID USER      PR  NI    VIRT    RES  %CPU %MEM     TIME+ S COMMAND                                                                                                                               1 root      20   0    2.0m   0.2m   0.0  0.0   0:00.51 S init                                                                                                                                  102 root      20   0    2.0m   0.2m   0.0  0.0   0:00.05 S  `- syslogd                                                                                                                           105 root      20   0    2.0m   0.2m   0.0  0.0   0:00.04 S  `- klogd                                                                                                                             120 root      20   0    2.7m   1.9m   0.0  0.2   0:00.22 S  `- udevd                                                                                                                             573 root      20   0    1.9m   0.1m   0.0  0.0   0:00.00 S  `- dropbear                                                                                                                          1113 root      20   0    2.3m   1.6m   1.0  0.2   0:13.36 S      `- dropbear                                                                                                                      1114 root      20   0    2.0m   1.5m   0.0  0.2   0:00.01 S          `- sh                                                                                                                        1189 root      20   0    2.8m   1.6m   0.0  0.2   0:28.82 T              `- top                                                                                                                   1220 root      20   0    2.8m   1.6m   1.9  0.2   0:24.25 R              `- top                                                                                                                   628 root      20   0    1.4m   0.1m   0.0  0.0   0:00.00 S  `- input-event-dae                                                                                                                   851 root      20   0    2.0m   0.3m   0.0  0.0   0:00.02 S  `- login                                                                                                                             852 root      20   0    2.0m   1.6m   0.0  0.2   0:00.63 S      `- sh                                                                                                                            893 root      20   0    1.4m   0.2m   0.0  0.0   0:00.33 S          `- wdt_deamon                                                                                                                1234 root      20   0   39.4m  14.5m  62.1  1.6   1:05.77 S          `- pupa_face                                                                                                                 2 root      20   0    0.0m   0.0m   0.0  0.0   0:00.04 S kthreadd                                                                                                                              3 root       0 -20    0.0m   0.0m   0.0  0.0   0:00.00 I  `- rcu_gp                                                                                                                            4 root       0 -20    0.0m   0.0m   0.0  0.0   0:00.00 I  `- rcu_par_gp                                                                                                                        8 root       0 -20    0.0m   0.0m   0.0  0.0   0:00.00 I  `- mm_percpu_wq                                                                                                                      9 root      20   0    0.0m   0.0m   0.0  0.0   0:01.84 S  `- ksoftirqd/0                                                                                                                       10 root      20   0    0.0m   0.0m   1.0  0.0   1:19.85 I  `- rcu_preempt                                                                                                                       11 root      20   0    0.0m   0.0m   0.0  0.0   0:00.00 I  `- rcu_sched     	

在使用单线程时,lv_demo_widgets在操作,如果是在刷新界面时,很明显有时是无法反应你的触摸操作的,改用多线程后,响应基本是很实时.

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 洛谷 P1179 [NOIP2010 普及组] 数字统计 题解
  • Docker 相关命令
  • HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 单选题序号4
  • 【探索Linux】P.42(传输层 —— TCP面向字节流 | TCP粘包问题 | TCP异常情况 )
  • OpenWrt 为软件包和docker空间扩容
  • 【过滤器 vs 拦截器】SpringBoot中过滤器与拦截器:明智选择的艺术(如何在项目中做出明智选择)
  • html+css 实现水波纹按钮
  • TCP/IP协议(全的一b)应用层,数据链层,传输层,网络层,以及面试题
  • 披荆斩棘:Python开发者在市场低迷期快速找到工作的策略
  • C# 植物大战僵尸
  • 关于海康网络摄像头使用VLC或者Opencv拉流有延迟的问题
  • Linux网络:传输层TCP协议(四)拥塞控制及延迟应答
  • 前端和Postman调用同一个接口,拿到的数据不一样
  • Visual Studio 2022美化
  • GitHub每日最火火火项目(7.26)
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • CAP 一致性协议及应用解析
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Laravel 菜鸟晋级之路
  • Linux后台研发超实用命令总结
  • PV统计优化设计
  • springboot_database项目介绍
  • v-if和v-for连用出现的问题
  • 动态魔术使用DBMS_SQL
  • 盘点那些不知名却常用的 Git 操作
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 数组的操作
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #AngularJS#$sce.trustAsResourceUrl
  • #前后端分离# 头条发布系统
  • #数据结构 笔记三
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (待修改)PyG安装步骤
  • (二)Linux——Linux常用指令
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • ***原理与防范
  • .naturalWidth 和naturalHeight属性,
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .net mvc 获取url中controller和action
  • .net反混淆脱壳工具de4dot的使用
  • .NET面试题(二)
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .NET项目中存在多个web.config文件时的加载顺序
  • .net与java建立WebService再互相调用
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • .考试倒计时43天!来提分啦!