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

这篇具有很好参考价值的文章主要介绍了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_THREAD
    printf("commit request!!!!!!!!!!!\n");
    pthread_mutex_lock(&g_commit_mutex);
    pthread_cond_broadcast(&g_commit_cond);
    pthread_mutex_unlock(&g_commit_mutex);
#else
	ret = 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在操作,如果是在刷新界面时,很明显有时是无法反应你的触摸操作的,改用多线程后,响应基本是很实时.文章来源地址https://www.toymoban.com/news/detail-736249.html

到了这里,关于LVGL - RV1109 LVGL UI刷新效率优化-02的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【PyQt5实现多线程更新UI】- 提高程序效率,优化用户体验

    【PyQt5实现多线程更新UI】- 提高程序效率,优化用户体验 在PyQt5应用程序的开发中,当程序需要处理大量数据或进行复杂的计算时,如果仅使用主线程,会导致GUI界面失去响应,用户体验较差。为了解决这个问题,通常需要使用多线程技术。 而在使用多线程时,往往需要更新

    2024年02月07日
    浏览(7)
  • rv1126/1109平台下的lt8912显示驱动的调试

    rv1126/1109平台下的lt8912显示驱动的调试

    使用的瑞芯微的rv1109的平台,显示接口为MIPI,需要外接LVDS的显示屏,同时外接HDMI显示屏显示。 硬件调试注意事项如下: 检查原理图,确保原理图正确。 检查接口的电平匹配问题,LT8912 io最大支持1.8V,注意电平转换问题(IIC,REST脚)。 检查晶振是否振。 IIC不要强上拉,否

    2024年02月08日
    浏览(10)
  • ubuntu22.04下rv1109 rootfs编译问题处理

    出于对Ubuntu新版本系统的体验,将系统更新到了ubuntu22.04了。然后在编译rv1109 sdk时出现了一些异常的错误。但是已经不回去了,只能硬着头皮一路走下去了。并将错误记录以下,以便下次有类似错误,做个参考。 buildroot 报错:c-stack.c:55:26:error:missing binary operator before token “

    2024年02月11日
    浏览(10)
  • rk3588/rk356x/rv1109/rv1126 live555移植+mpp编译 rtsp拉流

    rk3588/rk356x/rv1109/rv1126 live555移植+mpp编译 rtsp拉流

    本文主要是为了记录一下rk板子的踩坑日记。 项目主要是rk3588 rtsp拉流。 1.下载MPP源码:https://github.com/rockchip-linux/mpp 2.rk3588/rk356x的板子进入Mpp源码目录 mpp/build/linux/aarch64 (rk3588/rk356x是64位板子)中,修改 arm.linux.cross.cmake 文件中的配置 修改 make-Makefiles.bash 的配置,主要改

    2023年04月19日
    浏览(34)
  • Linphone3.5.2 ARM RV1109音视频对讲开发记录

    说明 这是一份事后记录,主要记录的几个核心关键点,有可能很多细节没有记上,主要是方便后面自己再找回来! 版本 3.5.2 一些原因选的是这样一个旧的版本! 新的开发最好选新一些的版本吧, 像 4.5, 4.2, 3.8 这一类的! 因为之前没有开发过Linphone的应用,所以对整个框架不了

    2024年02月07日
    浏览(11)
  • 【RV1126】移植LVGL

    【RV1126】移植LVGL

    RV1126文件系统下面没有 /dev/fb0 设备节点: 进入kernel 进入配置: 修改位置一,如下: 修改位置二,如下: 之后重新编译生成固件烧写到开发板。 地址:https://github.com/lvgl/lv_port_linux_frame_buffer git克隆地址:https://github.com/lvgl/lv_port_linux_frame_buffer.git 官方文档:https://blog.lvgl.i

    2024年02月07日
    浏览(9)
  • ESP32 移植 LVGL UI 库

    ESP32 移植 LVGL UI 库

    硬件:ESP32 LCD : ST7796  3.5寸 480*320 屏  电容触摸 IC: GT911 IDE: Visual Studio Code with Platoform IO extension LVGL 版本:3.0 移植前已经使用 eSPI 驱动起了 ST7796 屏,别且实现了触摸驱动。 下载 LVGL 代码 下载 LVGL 文件,放置到 工程的 .lib 库中:   编辑配置文件 把 LVGL 源文件根目录下的 

    2024年02月07日
    浏览(13)
  • 【LVGL学习笔记】(五)使用SquareLine Studio设计UI

    【LVGL学习笔记】(五)使用SquareLine Studio设计UI

    LVGL全程LittleVGL,是一个轻量化的,开源的,用于嵌入式GUI设计的图形库。并且配合LVGL模拟器,可以在电脑对界面进行编辑显示,测试通过后再移植进嵌入式设备中,实现高效的项目开发。 LVGL中文教程手册:极客笔记之LVGL教程 介绍: SquareLine Studio 是LVGL官方推荐的UI设计平台

    2024年02月03日
    浏览(12)
  • metaRTC7集成lvgl ui demo编译指南

    开源轻量级嵌入式图形库lvgl:Light and Versatile Graphics Library,最低只需8kb内存,可为任何 MCU、MPU 和显示类型创建漂亮的 UI。 metaRTC新增lvgl demo,可在linux下编译运行。 https://github.com/metartc/metaRTC/releases/tag/7.0.050 https://github.com/metartc/metaRTC/releases/tag/7.0.050 https://gitee.com/metartc/metaRT

    2024年02月07日
    浏览(30)
  • 【案例讲解】LVGL 向UI任务发送顺序执行的延时任务方法

    更多源码分析请访问: LVGL 源码分析大全 由于 lv_timer_create 的执行实现方式为 后进先出 的栈执行方式,这导致在添加一些需要顺序执行的延时任务时会很麻烦,因此,需要实现一个 先进先出 接口。 以ESP32中 examples/factory_demo 为例:ESP32上的LVGL是采用多任务(相当于Linux上的

    2024年01月16日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包