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在操作,如果是在刷新界面时,很明显有时是无法反应你的触摸操作的,改用多线程后,响应基本是很实时.

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

CVE-2023-5129 libwebp堆缓冲区溢出漏洞影响分析

漏洞简述 近日苹果、谷歌、Mozilla和微软等公司积极修复了libwebp组件中的缓冲区溢出漏洞,相关时间线如下: 9月7日,苹果发布紧急更新,修复了此前由多伦多大学公民实验室报告的iMessage 0-click 漏洞,漏洞被认为已经被…

【Element-UI】Mock.js,案例首页导航、左侧菜单

一.Mock.js 1、什么是Mock.js Mock.js是一个用于生成模拟数据的JavaScript库。它能够模拟后端API接口,用于前端开发时进行接口调试和测试提高自动化测试效率。使用Mock.js可以快速创建虚拟的数据,并且可以设置数据的类型、格式和规则,从而模…

TouchGFX之动态位图

标准位图会被编译到应用中,因此必须在编译时提供。在运行时间在RAM中创建位图,被称为动态位图。 动态位图的使用与编译到应用中的静态位图相同。 动态位图配置 必须先配置位图缓存,然后才能创建动态位图。 FrontendApplication.hpp#inclu…

【冰糖R语言】创建R包(打包R程序)

目标:将现有R程序打包 可能涉及知识点:devtools包、usethis包、Rstudio软件 一、R包的类型 通常一个R包中包含以下元素: 1)R文件夹:函数代码 2)man文件夹:存放每个函数的注释文件 3&#x…

大数据Flink(九十二):DML:集合操作

文章目录 DML:集合操作 DML:集合操作 集合操作支持 Batch\Streaming 任务。 UNION:将集合合并并且去重。

抖音短视频seo矩阵系统源代码开发系统架构及功能解析

短视频seo源码,短视频seo矩阵系统底层框架上支持了从ai视频混剪,视频批量原创产出,云存储批量视频制作,账号矩阵,视频一键分发,站内实现关键词、短视频批量搜索排名,数据统计分类多功能细节深度…

【教学类-38】A4红纸-国旗灯笼(庆祝中华人民共和国成立74周年)

作品展示: 背景需求: 从教十余年,我在每年国庆都带领中大班孩子们制作与“国旗相关”国庆庆祝物品——国旗、礼盒 一、国旗(吸管、A4红纸、黄纸打印五角星) 二、铅画纸手提袋(8K铅画纸、A4红纸、黄色打印…

leetCode 213. 打家劫舍 II 动态规划 房间连成环怎么偷呢?

213. 打家劫舍 II - 力扣(LeetCode) 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装…

学信息系统项目管理师第4版系列13_立项管理

1. 项目立项管理包括 1.1. 项目建议与立项申请 1.2. 项目可行性研究 1.2.1. 初步可行性研究 1.2.2. 详细可行性研究 1.2.2.1. 不可缺少 1.2.2.1.1. 【高21上选21】 1.2.3. 可以依据项目的规模和繁简程度合二为一 1.3. 项目评估与决策 2. 立项申请 2.1. 项目建议书 2…

针对数据中心机房散热问题仿真

在对于部分室内布局设计而言我们需要考虑到室内的空气流通问题,当然了对于数据中心机房而言,电子信息设备在运行过程中产生大量热,这些热量如果不能及时排除,将导致机柜或主机房内温度升高,过高的温度将使电子元器件性…

windows 修改hosts映射,可以ping通,但是无法通过http url 路径访问,出现 500 Internal Privoxy Error

问题描述 今天在学习nginx时,想在hosts配置一个nginx的域名映射,但是发现访问nginx服务的ip时可以访问通,在dos命令窗口ping配置的域名映射也可以ping通,但是一旦在浏览器通过http请求访问配置的hosts域名映射时却出现 500 Inter…

JOSEF约瑟DZJ-402 DZY-401导轨式中间继电器 触点形式 两转换 AC、DC220V

DZY(J)-400导轨式中间继电器 系列型号 DZY、DZJ-401 DZY、DZJ-402 DZY、DZJ-403 DZY、DZJ-404 DZY、DZJ-405 DZY、DZJ-406 DZY、DZJ-407 DZY、DZJ-408 DZY、DZJ-409 DZY、DZJ-410 DZY、DZJ-411 DZY、DZJ-412 DZY、DZJ-413 DZY、DZJ-414 DzY、DZJ-415 DZY、DZJ…

利用抽象工厂模式提升游戏开发的精度与灵活性

引言 大家好,我是亿元程序员,一位有着8年游戏行业经验的主程。 本系列是《和8年游戏主程一起学习设计模式》,让糟糕的代码在潜移默化中升华,欢迎大家关注分享收藏订阅。 在开发过程中,如何有效地管理各种游戏对象并…

PHP各种老版本下载方式

最近因工作需要,要下载PHP7.3的最新版本版本。 PHP官网上提供了各种老版本下载地址: https://windows.php.net/downloads/releases/archives/ 下载速度不稳定,时快时慢。 使用前,给下载留足时间。 貌似晚上速度快一些。

ORACLE 内存结构之系统全局区(SGA)

每个 Oracle 数据库实例都会在内存中分配一个很大的内存结构, 称为系统全局区(System Global Area), 这是一个大型的共享内存结构,每个Oracle进程都会访问它。 在Linux/Unix操作系统上,SGA是一个物理实体,使用操作系统命令能“看到它”。 它被操作系…

算法题系列8·买卖股票的最佳时机

目录 题目描述 实现 提交结果 题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。 设计一个算法来计算你所能获取的最大利润。…

mrctf2020_shellcode_revenge

mrctf2020_shellcode_revenge Arch: amd64-64-little RELRO: Full RELRO Stack: No canary found NX: NX disabled PIE: PIE enabled RWX: Has RWX segments64位,开了PIE和RELRO,看到RWX出来,就感觉是shellcode了…

什么是Promise链(Promise chaining)?它在异步编程中的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是 Promise 链?⭐ 异步编程中的作用⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、…

FreeRTOS入门教程(空闲任务和钩子函数及任务调度算法)

文章目录 前言一、空闲任务概念二、钩子函数概念三、任务调度算法四、任务调度算法实验1.实验代码2.是否抢占3.时间片是否轮转4.空闲任务让步 总结 前言 本篇文章将带大家学习一下什么是空闲任务以及钩子函数,以及学习FreeRTOS中的任务调度算法,了解在F…

基于风险的漏洞管理实现高效安全

通常,网络中存在很多漏洞,修补和修复它们是一个永无止境的过程。但总会有这样的问题:“我应该首先补救什么?如果在我发现另一个开放漏洞之前就被攻击者利用怎么办?” 如何才能避免自己陷入怨恨和悔恨的想法中&#x…