皇冠新体育APP

IT技术之家

【LVGL】学习笔记--(3)界面切换以及显示优化_lvgl切换界面_公子无缘

发布了时期:2023-08-24 10:31:29 嵌入式 128次 标签:嵌入式硬件 C语言 LVGL 性能优化 gui guider Powered by 金山文档
界面切换和帧率优化...

一 界面切换

灵活运用lvgl结构作图GUI免不到需求保持多种界面的转换,我觉得把其它性能和模块都放着整页上都有些不太高贵典雅,还有而言植入式设施配置的小液晶屏有些过度吃力。所以说下面就需求保持多种界面(又某种程度lvgl里的screen)试述其他人转换。 控制目标方式(分类论文《LVGL V8APP——经过组合键调节网页》),有一些两大类控制目标方式:

【1】通过LV_OBJ_FLAG_HIDDEN隐藏属性实现页面切换:

体现工具栏1在前一天给工具栏2的贮槽配置LV_OBJ_FLAG_HIDDEN取消潜藏抗性,体现工具栏2在前一天给工具栏1的贮槽配置LV_OBJ_FLAG_HIDDEN取消潜藏抗性。

【2】切换到窗口2时,删除窗口1的容器:

附进的重要进行也还可以可以分为两种类型策略:
  1. 切换到窗口2时,可以在回调函数中删除窗口1的容器,这样可以删除窗口1下的所有子对象,这种方式适用于运存较小的设备。

static void win_btn_event_callback1(lv_event_t* event)
{
    lv_event_code_t code = lv_event_get_code(event);
    if (code == LV_EVENT_CLICKED)
    {
        // 删除窗口1的win1_contanier容器,这样就可以把win1_contanier上的子对象全部删除,然后显示窗口2
        lv_obj_del(win1_contanier);
        show_button_win2();
    }
}
 
 
static void win_btn_event_callback2(lv_event_t* event)
{
    lv_event_code_t code = lv_event_get_code(event);
    if (code == LV_EVENT_CLICKED)
    {
        // 删除窗口2的win2_contanier容器,这样就可以把win2_contanier上的子对象全部删除,然后显示窗口1
        lv_obj_del(win2_contanier);
        show_button_win1();
    }
}

  1. 使用函数lv_scr_load_anim和lv_scr_load加载和切换屏幕:

/* 直接加载该屏幕scr
参数1:要加载的屏幕 */
static inline void lv_scr_load(lv_obj_t * scr)
{
    lv_disp_load_scr(scr);
}

/* 通过动画的方式显示
参数1:要加载的屏幕
参数2:动画类别
参数3:切换动画需要的时间
参数4:为true时则会在切换界面后将旧界面删除,节约内存*/
void lv_scr_load_anim(lv_obj_t * scr, lv_scr_load_anim_t anim_type, uint32_t time, uint32_t delay, bool auto_del);

我这边用到的是第二类方式,即GUI Guider中自动生成的事件+加载页面动作的方式:

二 显示优化

因为用到界面的切换,涉及整屏(320*240)的刷新,如果绘制较为复杂的画面,界面切换的过程中会有拉窗帘的效果,非常影响美观。所以显示的优化就不得不考虑了。

对比《LVGL体现网站升级简化—最基本网站升级简化》、《LVGL 网站升级简化帧率窍门》,有接下来五种网站升级简化做法以供对比:

【1】disp_flush刷屏方法改进

一种点事先移殖的情况下也提过(《【LVGL】学习成绩读书笔记--(1)Keil中镶入式软件系统移殖LVGL》),在disp_flush中使用封安装好的LCD_Fill_LVGL刷屏数学指数函数带替一开始默认要求的画点数学指数函数。

【2】LVGL帧率限制

LVGL是有个个帧率重置时间间隔的宏名词解释,在lv_conf.h里。LVGL会凭借LVGL里面的的tick,订时去刷荧屏,也也是说该宏名词解释限定版了LVGL刷屏帧率的进攻,同意满帧33帧。 这儿自己会直接变成10ms加载第一次,满帧100帧。随手再把投入机调用周期长也变成10ms。
/*Default display refresh period. LVG will redraw changed areas with this period time*/
#define LV_DISP_DEF_REFR_PERIOD 10      /*[ms]*/  //默认30

/*Input device read period in milliseconds*/
#define LV_INDEV_DEF_READ_PERIOD 10     /*[ms]*/  //默认30

【3】LV_DPI_DEF配置

在lv_conf.h里增加DPI:
/*
  * LV_DPI_DEF 注意这里,虽然LVGL的作者说这个没这么重要,但他会严重影响到LVGL的动画效果
  * 你应该进行DPI的手动计算,例如320*240分辨率3.2英寸的屏幕,那么 DPI = (320*320+240*240)^0.5 / 3.2 = 125
  */
#define LV_DPI_DEF                  125     /*[px/inch]*/

【4】编译器版本以及代码优化等级

编译器固件版本一定用arm compiler5。编号提升档次能增强到Level 2:

【5】堆栈设置

  1. 栈设置:

游戏官方安利: 在重启文件资料startup_hc32f460.s中配置大一点儿,我对面配置为8K:
Stack_Size      EQU     0x00002000

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp


; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x00000200

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit


                PRESERVE8
                THUMB

  1. 堆设置:

lv_conf.h中的LV_MEM_SIZE实施设立,之前建议大于等于32K,我这边设为了能够48K:
/*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/
    #define LV_MEM_SIZE (48U * 1024U)          /*[bytes]*/

【6】显存类型

LVGL本来给出了两类独显存储品类。两类分辨对应着不同于条件,都能以值得 (B站多大神开展过两类品类的软件测验LVGL 最佳手机配置软件测验 (STM32),应该参考选取一点,我她测了单BUFFER和非全尺寸大小双BUFFER,不同于不多)。先学下论证:

  1. 单BUFFER

游戏场景会被分拆成buffer的size宽度,分块突破,当仅仅轮廓突破时,列如说点击事件好几回个旋钮旋钮上升亮,那末他就就会刷轮廓游戏场景。官网比较适合 1/10 screen size,分拆太少,刷屏电源接口又慢话,既帧率低,还有动人的拉帘。整大屏刷时间快是快,但有太占运存了。 我这里那里优化为1/4全屏,目的还非常好:
/* 单缓冲区示例) */
static lv_disp_draw_buf_t draw_buf_dsc_1;
static lv_color_t buf_1[MY_DISP_HOR_RES * MY_DISP_VER_RES / 4]; 
lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_1, NULL, MY_DISP_HOR_RES * MY_DISP_VER_RES / 4);   /*Initialize the display buffer*/

  1. 非全尺寸双BUFFER

由此可见,好几个buffer,现实情况下上正是PING-PONG形式,这个情况下最适合有dma或者是另外运存促使机器的电源芯片,在一小块buffer动用dma等外设页面刷屏时,lvgl不错再前台人员宣传提示进另外一个小块运存,也正是说宣传和刷屏消息队列执行工作,理论与实践是比单运存不错的,然而跟计算机硬件和电子屏幕程度相关联,具体的要亲测。

  1. 全尺寸双BUFFER

两全面积buffer,既然理智爱来和非全面积双buffer是本质区别不高,但现场上,你这个是特别为带TFT驱程器的MCU做好准备的。双全面积与前与众不同与众不同,在其他之时 ,拿出的buffer都要全屏程度的buffer,而不只是轮廓线获取只打造获取个部分的buffer窗口化,这做的的效果是刷屏,只想要更变TFT驱程器的显卡内存门店地址,而不想要将LVGL的buffer再货物搬运到TFT驱程器的显卡内存,就可做完刷屏動作。

以下。