定义
LVGL 是一套面向嵌入式设备的开源图形界面开发框架,全称为 Light and Versatile Graphics Library,即轻量且多功能的图形库[5]。其设计目标是在资源受限的硬件上呈现较为现代、流畅的图形界面,因此在运行效率、内存占用和可移植性方面做了针对性优化[5]。
它本质上是一个用 C 语言实现的函数库,不绑定任何芯片厂商或操作系统,开发者只需提供显示驱动与输入驱动接口,就能把同一套界面代码移植到不同硬件上[1][5]。该项目采用 MIT 许可证,可用于商业项目[1]。
原理
LVGL 采用面向对象的控件体系,内置按钮、标签、滑块、图表、键盘、表格、列表等 30 余种控件,每个控件是一个独立对象,拥有自己的属性与状态,开发者通过组合对象而非逐像素绘制来搭建界面[1][4]。其样式系统借鉴 CSS 的思路,提供约 100 项样式属性,支持级联、继承以及按对象设置的局部样式,圆角、阴影、渐变、字体、间距等均以样式描述[1][6]。布局方面提供 Flex 与 Grid 两种方式,可随容器变化自动调整控件尺寸与位置[1]。
渲染环节的机制是分层解耦。界面上的控件先被拆解为矩形、边框、文本、阴影等基本绘制任务,收集成任务列表后交由绘制单元执行;绘制单元可以是 CPU 核心、2D GPU 或图形加速器,调度过程会评估哪一类绘制单元适合处理该任务,无法硬件加速的圆角矩形等操作则由 CPU 软件渲染兜底[7]。这一架构使 LVGL 在只有单帧缓冲区的情况下也能保持较为平滑的刷新[2]。
内存策略上,LVGL 不整屏重绘,而是只刷新内容发生变化的区域,配合一块小于屏幕的渲染缓冲区工作,推荐缓冲区至少为屏幕面积的 1/10[1][8]。官方给出的最低硬件门槛为 16、32 或 64 位微控制器或微处理器、64 kB 以上 Flash 与 16 kB 以上 RAM,具体占用随硬件平台与编译配置变化[2][9]。文本方面使用 UTF-8 编码,支持中日韩文、阿拉伯文、希伯来文等书写系统以及双向文本排版[1]。
发展历程
该项目最初名为 LittlevGL,由匈牙利工程师 Gábor Kiss-Vámosi 于 2016 年作为个人项目在 GitHub 上发布首个公开版本[10]。项目在此后数年间持续迭代,吸引了来自世界各地的贡献者参与[10]。
2020 年 5 月发布的 v7 版本是一次重要转折:项目正式由 LittlevGL 更名为 LVGL,并成立了公司负责项目的长期运营与商业服务;同时重写了绘制引擎,改用遮罩方式实现抗锯齿的圆、线与圆弧绘制,并以新的样式系统取代旧机制,引入了接近 CSS 的级联与继承特性[6]。项目核心库在此后仍保持 MIT 许可证开源并由社区驱动[11]。
v8 版本整合了控件体系并引入 CSS 风格的布局,v9 版本则完成了渲染架构的解耦与并行化改造[12]。v9.0 于 2024 年 1 月发布,是一次包含破坏性 API 变更的大版本[13]。该版本内置了对 pthread、FreeRTOS 等操作系统的支持,允许渲染任务在独立线程中执行;新增 Observer 机制用于把数据源与界面元素绑定;集成 ThorVG 以支持矢量图形绘制;并内置了 SDL、Linux 帧缓冲、NuttX 以及 ST7789、ILI9341 等显示与触摸驱动[8]。v9.1.0 于 2024 年 3 月发布,为发布后的首个维护性更新[14]。
应用
LVGL 的应用覆盖消费电子、工业控制、汽车电子和医疗设备等领域。在消费电子中,它常用于智能家居控制面板、家电显示屏、智能手表与手环等需要在有限资源下提供交互界面的产品[5]。在工业控制中,它被用于人机界面与各类仪器仪表的显示[5]。
硬件侧,LVGL 可在满足配置要求的多种微控制器上运行,包括恩智浦的 Kinetis、LPC、i.MX 与 i.MX RT 系列,意法半导体的 STM32 系列,微芯的 PIC32 系列,以及乐鑫 ESP32、北欧半导体 nRF52 等平台,也可运行在 Linux 帧缓冲、树莓派等环境上[2]。它还能与 FreeRTOS、RT-Thread、Zephyr 等实时操作系统以及裸机程序配合使用[3]。芯片厂商方面,微芯、乐鑫等企业在各自生态中提供了 LVGL 的集成支持[3][4]。
开发方式上,LVGL 提供 MicroPython 绑定与面向微控制器的 PikaScript 绑定,支持 Make 与 CMake 构建系统,并可借助模拟器在个人计算机上开发界面,再部署到嵌入式硬件上复用同一套界面代码[1][9]。
局限
LVGL 在资源极少的芯片上运行需要大幅裁剪。有开发者反映,在 52 kB RAM 级别的器件上以 480×320 分辨率同时启用多项功能会超出内存上限,需要关闭动画等未使用特性并下调缓冲区配置[15]。屏幕分辨率越高,占用的 RAM 越多,部分低端微控制器只能在较小分辨率下运行[16]。
字体与位图解码是另一处瓶颈。矢量字体动态加载方式在遇到未缓存字符时需重复解析整个字体文件,处理体积较大的多语言字体时单次渲染耗时可达数十秒,改用 FreeType 可改善速度[17]。图片解码同样消耗大量内存,PNG 解码所需 RAM 约为图像宽度乘高度乘 4 字节,外挂存储器读取图片还会带来可感知的显示延迟[18]。
性能上限受内存带宽与刷新机制影响。有报告指出,在高分辨率全屏刷新场景下,LVGL 因大量缓冲区拷贝而出现帧率偏低的情况,而在内存吞吐更好的平台上表现更佳[19]。此外,LVGL 默认使用通用 C 循环进行像素混合,未针对特定平台指令优化,在部分处理器上效率不高[20]。第三方基准测试显示,在同一块 STM32 开发板上运行相同界面时,LVGL 与 TouchGFX、Qt for MCUs 的性能与内存占用大体相当,并未在所有项目上都占优[21]。
参见
参考资料
- 📒 概况与总览 [引用日期2026-10-14]
- lvgl/lvgl • v8.3.9 - ESP Component Registry [引用日期2026-10-14]
- microchip.com 上的网页 [引用日期2026-10-14]
- LVGL — Light and Versatile Embedded UI Ecosystem [引用日期2026-10-14]
- LVGL 示例说明 [引用日期2026-10-14]
- CHANGELOG [引用日期2026-10-14]
- ti.com 上的网页 [引用日期2026-10-14]
- CHANGELOG [引用日期2026-10-14]
- APM32芯得EP.47|APM32F411在RT-Thread系统下移植LVGL-8.3 [引用日期2026-10-14]
- 还在用C编写LVGL上的画面,何不试试Python? (1) [引用日期2026-10-14]
- About — LVGL [引用日期2026-10-14]
- 从部件整合到架构重构:LVGL 主要发行版本演进的系统性分析 [引用日期2026-10-14]
- env_support [引用日期2026-10-14]
- 【喂到嘴边了的模块】LVGL9发布稳定性更新 - GorgonMeducer 傻孩子 [引用日期2026-10-14]
- Reduce size of LVGL example? [引用日期2026-10-14]
- forum [引用日期2026-10-14]
- github.com 上的网页 [引用日期2026-10-14]
- LVGL-注意事项 [引用日期2026-10-14]
- github.com 上的网页 [引用日期2026-10-14]
- seeedstudio.com 上的网页 [引用日期2026-10-14]