您尚未登录。

楼主 # 2021-08-18 00:18:24

逸俊晨晖
会员
注册时间: 2018-08-29
已发帖子: 151
积分: 137.5

哪吒D1运行lvgl8在24寸1080P显示器上渲染

今天我们来试试移植lvgl8到哪吒D1 并在24寸1080P显示器上渲染

上lvgl的github下载源码

修改几处
lv_conf.h
增加lvgl最大使用内存

#define LV_MEM_SIZE    (1024U * 1024U)

打开CPU占用和FPS指示

#define LV_USE_PERF_MONITOR     1

开启音乐播放器演示
lv_demo_conf.h

#define LV_USE_DEMO_MUSIC      1
#define LV_DEMO_MUSIC_LANDSCAPE 1
#define LV_DEMO_MUSIC_LARGE     1
#define LV_DEMO_MUSIC_AUTO_PLAY  1

增大缓冲 双缓冲
main.c

#define DISP_BUF_SIZE (1920 * 1080 * 4)
static lv_color_t buf[DISP_BUF_SIZE];
static lv_color_t buf2[DISP_BUF_SIZE];

lv_disp_draw_buf_init(&disp_buf, buf, buf2, DISP_BUF_SIZE);

把原来的lv_demo_widget改成

lv_demo_music();

我把整个源码重新用cmake构建了一遍 这样就不用去看原来的makefile了
附件中提供了源码工程 只要改一下CMakeLists.txt里的编译器 执行(注意有个点)

cmake . 

再执行

make

就可以直接编译了
附件中还提供了应用程序 放进去直接运行看效果

演示视频:
lvgl8播放器

lvgl8窗口
D1运行LVGL8_widget.jpg
lvgl7窗口


效果还不错

附件:
哪吒D1运行LVGL8在24寸1080P显示器上渲染附件.zip

离线

#1 2021-08-18 09:45:49

山羊胡子
会员
注册时间: 2020-11-10
已发帖子: 9
积分: 1.5

Re: 哪吒D1运行lvgl8在24寸1080P显示器上渲染

滑动时帧率还是太低了(<10),顿感明显,能否使用GPU而非fb?

离线

#2 2021-08-25 10:46:12

茶小绿
会员
注册时间: 2019-09-02
已发帖子: 4
积分: 3

Re: 哪吒D1运行lvgl8在24寸1080P显示器上渲染

强啊,全志的Rsic V

离线

#3 2021-08-25 12:24:09

novice
会员
注册时间: 2019-07-26
已发帖子: 74
积分: 60

Re: 哪吒D1运行lvgl8在24寸1080P显示器上渲染

lvgl的架构不适合高要求的场合,它明显是为了低端设备设计的。为了省内存和简化移植驱动架构显得很简陋,在低端设备上对RAM占用和代码体积非常敏感,那样做是可以理解的,但在高要求场合这简陋的驱动架构明显不够看了。

离线

#4 2021-08-25 14:06:16

达克罗德
会员
注册时间: 2018-04-10
已发帖子: 1,057
积分: 1019.5

Re: 哪吒D1运行lvgl8在24寸1080P显示器上渲染

QT不知道跑起来帧率如何,QT做了很多优化的

离线

#5 2021-08-25 16:56:38

memory
会员
注册时间: 2021-08-11
已发帖子: 45
积分: 23

Re: 哪吒D1运行lvgl8在24寸1080P显示器上渲染

https://bbs.aw-ol.com/topic/303/awol-lvgl/4
哪吒D1开发板 LVGL7 源码下载(带git仓库)



为什么我这个很流畅? 1080p显示器保持了33fps。

离线

楼主 #6 2021-08-26 10:09:19

逸俊晨晖
会员
注册时间: 2018-08-29
已发帖子: 151
积分: 137.5

Re: 哪吒D1运行lvgl8在24寸1080P显示器上渲染

山羊胡子 说:

滑动时帧率还是太低了(<10),顿感明显,能否使用GPU而非fb?

不滑动还是可以的 gpu这方面还没仔细了解

离线

楼主 #7 2021-08-26 10:10:32

逸俊晨晖
会员
注册时间: 2018-08-29
已发帖子: 151
积分: 137.5

Re: 哪吒D1运行lvgl8在24寸1080P显示器上渲染

茶小绿 说:

强啊,全志的Rsic V

抓到一只绿茶 快回荔枝群 C4想你了

离线

楼主 #8 2021-08-26 10:15:57

逸俊晨晖
会员
注册时间: 2018-08-29
已发帖子: 151
积分: 137.5

Re: 哪吒D1运行lvgl8在24寸1080P显示器上渲染

memory 说:

https://bbs.aw-ol.com/topic/303/awol-lvgl/4
哪吒D1开发板 LVGL7 源码下载(带git仓库)



为什么我这个很流畅? 1080p显示器保持了33fps。

你开幻灯片演示自动滑动试试

离线

#9 2021-08-26 10:46:59

memory
会员
注册时间: 2021-08-11
已发帖子: 45
积分: 23

Re: 哪吒D1运行lvgl8在24寸1080P显示器上渲染

逸俊晨晖 说:
memory 说:

https://bbs.aw-ol.com/topic/303/awol-lvgl/4
哪吒D1开发板 LVGL7 源码下载(带git仓库)



为什么我这个很流畅? 1080p显示器保持了33fps。

你开幻灯片演示自动滑动试试

请教这个怎么开呢?

离线

楼主 #10 2021-08-26 11:16:29

逸俊晨晖
会员
注册时间: 2018-08-29
已发帖子: 151
积分: 137.5

Re: 哪吒D1运行lvgl8在24寸1080P显示器上渲染

memory 说:
逸俊晨晖 说:
memory 说:

https://bbs.aw-ol.com/topic/303/awol-lvgl/4
哪吒D1开发板 LVGL7 源码下载(带git仓库)



为什么我这个很流畅? 1080p显示器保持了33fps。

你开幻灯片演示自动滑动试试

请教这个怎么开呢?

lv_ex_conf.h
#define LV_DEMO_WIDGETS_SLIDESHOW  1

离线

#11 2021-08-29 16:30:13

哇酷小二
管理员
注册时间: 2020-04-22
已发帖子: 2,707
积分: 1902

Re: 哪吒D1运行lvgl8在24寸1080P显示器上渲染

感谢楼主热心分享, 点击往期链接不迷路:

哪吒D1使用gstreamer硬解码
https://whycan.com/t_7078.html

哪吒D1编译配置DLNA客户端进行B站投屏
https://whycan.com/t_7091.html

哪吒D1运行lvgl8在24寸1080P显示器上渲染
https://whycan.com/t_7044.html

离线

#12 2021-09-01 17:39:45

茶小绿
会员
注册时间: 2019-09-02
已发帖子: 4
积分: 3

Re: 哪吒D1运行lvgl8在24寸1080P显示器上渲染

该评论内容与本帖子无关,鼓励各位坑友积极发言讨论与帖子有关的内容!

离线

  • 不通过:与技术无关

#13 2021-09-03 09:23:44

海石生风
会员
注册时间: 2019-07-02
已发帖子: 23
积分: 47

Re: 哪吒D1运行lvgl8在24寸1080P显示器上渲染

@novice
完全同意观点。我看它的源码时有点惊到了,不是事件驱动型框架,有点像立即式UI框架。然后研究AWTK,架构似乎不错,但太多回调函数各种结构体类型转换,阅读及调试有点困难,不过这应该是C语言项目的通病,还是值得入手。

最近编辑记录 海石生风 (2021-09-03 10:10:39)

离线

#14 2021-11-04 10:58:57

达克罗德
会员
注册时间: 2018-04-10
已发帖子: 1,057
积分: 1019.5

Re: 哪吒D1运行lvgl8在24寸1080P显示器上渲染

@novice
具体哪方面不够看呢?

离线

#15 2021-11-04 12:49:17

novice
会员
注册时间: 2019-07-26
已发帖子: 74
积分: 60

Re: 哪吒D1运行lvgl8在24寸1080P显示器上渲染

达克罗德 说:

@novice
具体哪方面不够看呢?

我手中的这份LVGL是8.1版本,这是它的硬件抽象层,可以看到它并没有对硬件加速很感兴趣,主要还是依赖软件来执行。
真正专业的HAL应该能够利用硬件矩形填充(包括阿尔法填充)、硬件BLT操作(包括blend),硬件像素格式转换(RGB565/ARGB888/YUV422等)、硬件2x2矩阵操作(旋转、缩放、平移、剪切等)、硬件光标等。如果硬件不支持那就用软件完成。

但是这些东西可能会提高驱动移植的难度,而且也提高了对资源的需求,所以LVGL优先选择了小巧的方向。LVGL还有一些分散的代码利用STM32/NXP的硬件加速,不过很不规范,所以我猜想他们会继续改版。

LVGL不支持这些东西不是它的错,它的定位是小资源硬件平台。1080P这种高分辨率场合还是不要为难它了,毕竟MPU不仅仅要做GUI绘制还要处理其它事务,Fill/Blend/BitBlt这些繁重的任务最好还是硬件来完成。

/**
 * Display Driver structure to be registered by HAL.
 * Only its pointer will be saved in `lv_disp_t` so it should be declared as
 * `static lv_disp_drv_t my_drv` or allocated dynamically.
 */
typedef struct _lv_disp_drv_t {

    lv_coord_t hor_res;         /**< Horizontal resolution.*/
    lv_coord_t ver_res;         /**< Vertical resolution.*/

    /** Pointer to a buffer initialized with `lv_disp_draw_buf_init()`.
     * LVGL will use this buffer(s) to draw the screens contents*/
    lv_disp_draw_buf_t * draw_buf;

    uint32_t full_refresh : 1;       /**< 1: Always make the whole screen redrawn*/
    uint32_t sw_rotate : 1;          /**< 1: use software rotation (slower)*/
    uint32_t antialiasing : 1;       /**< 1: anti-aliasing is enabled on this display.*/
    uint32_t rotated : 2;            /**< 1: turn the display by 90 degree. @warning Does not update coordinates for you!*/
    uint32_t screen_transp : 1;      /**Handle if the screen doesn't have a solid (opa == LV_OPA_COVER) background.
                                       * Use only if required because it's slower.*/

    uint32_t dpi : 10;              /** DPI (dot per inch) of the display. Default value is `LV_DPI_DEF`.*/

    /** MANDATORY: Write the internal buffer (draw_buf) to the display. 'lv_disp_flush_ready()' has to be
     * called when finished*/
    void (*flush_cb)(struct _lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p);

    /** OPTIONAL: Extend the invalidated areas to match with the display drivers requirements
     * E.g. round `y` to, 8, 16 ..) on a monochrome display*/
    void (*rounder_cb)(struct _lv_disp_drv_t * disp_drv, lv_area_t * area);

    /** OPTIONAL: Set a pixel in a buffer according to the special requirements of the display
     * Can be used for color format not supported in LittelvGL. E.g. 2 bit -> 4 gray scales
     * @note Much slower then drawing with supported color formats.*/
    void (*set_px_cb)(struct _lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y,
                      lv_color_t color, lv_opa_t opa);

    /** OPTIONAL: Called after every refresh cycle to tell the rendering and flushing time + the
     * number of flushed pixels*/
    void (*monitor_cb)(struct _lv_disp_drv_t * disp_drv, uint32_t time, uint32_t px);

    /** OPTIONAL: Called periodically while lvgl waits for operation to be completed.
     * For example flushing or GPU
     * User can execute very simple tasks here or yield the task*/
    void (*wait_cb)(struct _lv_disp_drv_t * disp_drv);

    /** OPTIONAL: Called when lvgl needs any CPU cache that affects rendering to be cleaned*/
    void (*clean_dcache_cb)(struct _lv_disp_drv_t * disp_drv);

    /** OPTIONAL: called to wait while the gpu is working*/
    void (*gpu_wait_cb)(struct _lv_disp_drv_t * disp_drv);

    /** OPTIONAL: called when driver parameters are updated */
    void (*drv_update_cb)(struct _lv_disp_drv_t * disp_drv);

    /** OPTIONAL: Fill a memory with a color (GPU only)*/
    void (*gpu_fill_cb)(struct _lv_disp_drv_t * disp_drv, lv_color_t * dest_buf, lv_coord_t dest_width,
                        const lv_area_t * fill_area, lv_color_t color);

    /** On CHROMA_KEYED images this color will be transparent.
     * `LV_COLOR_CHROMA_KEY` by default. (lv_conf.h)*/
    lv_color_t color_chroma_key;

#if LV_USE_USER_DATA
    void * user_data; /**< Custom display driver user data*/
#endif

} lv_disp_drv_t;

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn