# EmbeddedGUI
**Repository Path**: embeddedgui/EmbeddedGUI
## Basic Information
- **Project Name**: EmbeddedGUI
- **Description**: 支持FPB、抗锯齿、动画、脏矩阵的高效嵌入式GUI
- **Primary Language**: C
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 47
- **Forks**: 17
- **Created**: 2024-08-30
- **Last Updated**: 2026-05-01
## Categories & Tags
**Categories**: desktop-ui
**Tags**: None
## README
# EmbeddedGUI
[](https://github.com/EmbeddedGUI/EmbeddedGUI/actions/workflows/github-actions-demo.yml) [](https://embeddedgui.readthedocs.io/en/latest/?badge=latest)
> **面向资源受限嵌入式系统的轻量级 C GUI 框架**
> RAM < 8 KB · ROM < 64 KB · CPU ~100 MHz · 无 FPU · 纯 C99 · MIT 许可
**[在线体验](https://embeddedgui.github.io/EmbeddedGUI/) · [完整文档](https://embeddedgui.readthedocs.io/en/latest/) · [Gitee](https://gitee.com/embeddedgui/EmbeddedGUI) · [GitHub](https://github.com/EmbeddedGUI/EmbeddedGUI)**

EmbeddedGUI 把嵌入式 GUI 的低资源约束、PFB 局部帧缓冲、脏矩形渲染和自动化验证流程放在同一个工程体系里;配合 AI 辅助开发,可以更快完成控件设计、资源生成、性能分析和跨平台验证。
- **程序员友好**:纯 C99、结构体 OOP、宏辅助类型转换,核心路径清晰可读
- **AI 协作友好**:文档化 workflow、可复现构建、QEMU 微秒级基准,适合让 AI 参与设计、排错和回归检查
- **嵌入式友好**:无 FPU、低 RAM/ROM、PC/STM32/QEMU/WASM 多平台覆盖,支持多屏与异构屏配置
---
## 📸 效果预览
HelloShowcase,所有控件的简单示例。

HelloStyleDemo,一个常规的多页面应用。

---
## ✨ 超轻量 PFB 架构
不需要全屏帧缓冲,30×40 像素的小块缓冲(RGB565 仅 **2.4 KB**)即可驱动整个屏幕。
**HelloSimple 资源占用**:
| Code | Resource | RAM | PFB | Total ROM |
|------|----------|-----|-----|-----------|
| 20,780 B (~20 KB) | 8,016 B (~8 KB) | 968 B | 2,400 B | 28,796 B |
- **脏矩形**:只重绘变化区域,静态画面零 CPU 消耗,降低功耗
- **纯 C99**:无第三方依赖,支持 C++ 调用,易于移植
- **抗锯齿**:圆 / 弧 / 线全部支持 4×4 子像素抗锯齿,可降级为快速查表模式
---
## 🔄 Virtual 控件 —— 按需实例化,省 RAM
传统方式 100 个列表项 = 100 个控件实例;Virtual 模式**只实例化屏幕可见项**,其余回收复用。
| | 传统模式 | Virtual 模式 |
|---|---|---|
| 100 项列表 | 100 个实例 | 仅可见项实例化 |
| 内存策略 | 全部常驻 | 可见区 + overscan 缓冲 |
**底层组件**(`src/widget/egui_view_virtual_*.h`):Viewport · Page · Grid · Strip · Section List · Tree · Stage
**高级封装**(ViewHolder 模式):ListView · GridView
> 示例:[example/HelloVirtual](example/HelloVirtual)(19 个子应用)
---
## 🖥️ 多屏与异构屏
核心运行时支持 `EGUI_CONFIG_MAX_DISPLAY_COUNT` 配置多个 display/core,PC SDL 端可同时打开多窗口,并按 display 维度隔离输入、截图和录制帧。
| 示例 | 说明 |
|------|------|
| `HelloMultiDisplay` | 双屏 Activity 示例,验证主副屏点击隔离、并发 Activity 动画和 core task queue |
| `HelloMultiDisplayHetero` | 主屏 + 小尺寸副屏的异构屏示例,验证副屏 tick 连续性、跨 core 同步和副屏点击复位 |
异构屏可通过 `EGUI_CONFIG_SCREEN_1_WIDTH` / `EGUI_CONFIG_SCREEN_1_HEIGHT` / `EGUI_CONFIG_PFB_1_WIDTH` / `EGUI_CONFIG_PFB_1_HEIGHT` 为额外 display 配置独立尺寸。
---
## ✏️ 4 种遮罩,像素级视觉效果
| 遮罩 | 用途 |
|------|------|
| `mask_circle` | 圆形剪切 |
| `mask_round_rectangle` | 圆角矩形剪切 |
| `mask_gradient` | Alpha 渐变遮罩 |
| `mask_image` | 图片 Alpha 遮罩 |
支持**行级批处理优化**,非逐像素暴力遍历,在保证效果的同时兼顾性能。
---
## 📊 QEMU 微秒级性能基准 —— 每次提交都可量化
基于 QEMU 指令级模拟(`-icount shift=0`),同一代码在任何机器上得到**相同结果**,回归检测阈值 10%。
**关键数据**(Cortex-M3 profile):
| 场景 | 耗时 |
|------|------|
| TEXT_RECT | 0.590 ms |
| IMAGE_565 | 0.240 ms |
| GRADIENT_CIRCLE | 3.151 ms |
| SHADOW_ROUND | 1.797 ms |
覆盖 **200+ 个测试场景**,涵盖图形 / 文本 / 图片 / 遮罩 / 动画,支持 PFB Matrix / SPI Matrix 矩阵测试。
---
## 📱 三种页面方案,按需选择
| | Activity | Page | Virtual Stage |
|---|---|---|---|
| 复杂度 | 完整生命周期(6 状态) | 轻量(open/close) | 控件级容器 |
| 内存 | 栈式管理,常驻 | union 可重用 RAM | 回收池复用 |
| 适用场景 | 导航栈、完整 App | 简单多页切换 | 仪表盘、叠层布局 |
- **Activity**:类 Android 生命周期(CREATE → RESUME → PAUSE → DESTROY),配套 Dialog(浮层对话框)和 Toast(通知气泡)
- **Page**:精简模式,RAM 通过 union 重用,有基本输入事件分发
- **Virtual Stage**:绝对定位 + Z 轴排序,支持 pin/unpin 和 hit testing
> 小项目用 Page 省到极致,复杂项目用 Activity 完整管控,高级场景用 Virtual Stage 动态编排。
---
## 🚀 快速开始
```bash
git clone https://gitee.com/embeddedgui/EmbeddedGUI.git
cd EmbeddedGUI
# Windows
setup.bat
# Linux / macOS
./setup.sh
make all APP=HelloStyleDemo && make run
```
> 安装脚本默认会创建 `.venv` 并安装当前仓库所需的 Python 依赖。
> 更多说明见[环境搭建文档](https://embeddedgui.readthedocs.io/en/latest/)。
### 平台支持
| 平台 | 说明 |
|------|------|
| **PC (SDL2)** | 桌面模拟器,截图输出,快速开发验证 |
| **PC Test** | 无 SDL 的 headless 测试端口,用于 `HelloUnitTest` 和 CI |
| **STM32G0** | ARM Cortex-M0+ 裸机移植 |
| **QEMU** | 微秒级计时器,用于性能基准测试 |
| **WebAssembly** | Emscripten 编译,在线 Demo 直接运行 |
| **Designer Port** | 无 SDL、基于 stdin/stdout IPC 的设计器预览端口 |
| **自定义移植** | 仅需实现 `draw_area` + `get_tick_ms` 两个接口 |
构建系统:**GNU Make** 覆盖全部端口;**CMake** 当前覆盖带 `CMakeLists.txt` 的示例和 `pc` / `pc_test` 端口。
---
## 🧩 HelloBasic 控件库(66 个)
**布局**:Group · LinearLayout · GridLayout · Scroll · ViewPage · ViewPageCache · TileView · Window · Card
**显示**:Label · DynamicLabel · Image · DeferredImage · FileImage · Divider · Line · Textblock · Spangroup · LyricScroller
**输入**:Button · ImageButton · ButtonMatrix · Switch · Checkbox · RadioButton · ToggleButton · Slider · ArcSlider · NumberPicker · Roller · Combobox · Spinner · TextInput · Menu · AutoComplete · Chips · SegmentedControl · Stepper · PatternLock
**进度**:ProgressBar · CircularProgressBar · ActivityRing · PageIndicator · TabBar · Led · NotificationBadge · Scale · Gauge
**图表**:ChartLine · ChartScatter · ChartBar · ChartPie
**时间**:AnalogClock · DigitalClock · Stopwatch · MiniCalendar · Compass · HeartRate · AnimatedImage · Mp4
**列表**:List · Table
**专项验证**:Dirty Passthrough Container / Page / Activity · PunchRegion · SVG
---
## 🎨 绘图图元
| 类别 | 能力 |
|------|------|
| 基础图形 | 点、线、矩形、圆角矩形(可独立圆角)、三角形 |
| 圆 / 弧 | 查表模式(快速)+ 4×4 子像素 HQ 抗锯齿模式,支持圆头弧帽 |
| 线段 | 距离场 AA + 4×4 HQ 子像素,支持圆头线帽 |
| 折线 | 普通 / HQ / 圆头折线 |
| 曲线 | 二次 / 三次贝塞尔曲线(可选编译) |
| 椭圆 | 填充 / 描边椭圆(可选编译) |
| 多边形 | 填充 / 描边多边形(可选编译) |
| 渐变填充 | 线性(垂直 / 水平)+ 径向渐变,多停止点,可选抖动 |
| 文本 | 区域内绘制 / 多行 / 对齐,UTF-8 支持 |
| 图片 | 原尺寸 / 缩放绘制,支持染色 |
---
## 🎬 动画系统
**6 种动画类型**:Alpha(淡入淡出)· Translate(平移)· Scale/Size(缩放)· Resize(尺寸过渡)· Color(颜色插值)· AnimationSet(组合动画)
**9 种插值器**:
| 插值器 | 效果 |
|--------|------|
| Linear | 匀速 |
| Accelerate | 先慢后快 |
| Decelerate | 先快后慢 |
| AccelerateDecelerate | 缓入缓出 |
| Anticipate | 先回退再前进 |
| Overshoot | 超出目标后回弹 |
| AnticipateOvershoot | 回退 + 超出回弹 |
| Bounce | 末端弹跳 |
| Cycle | 正弦循环 |
支持:循环次数、RESTART / REVERSE 模式、fill_before / fill_after、start / repeat / end 回调。
---
## ⚙️ 可配置功能开关
所有功能均可在 `app_egui_config.h` 中按需裁剪,零开销禁用。
### 输入系统
| 宏 | 默认 | 说明 |
|----|------|------|
| `EGUI_CONFIG_FUNCTION_SUPPORT_TOUCH` | 1 | 单点触控 |
| `EGUI_CONFIG_FUNCTION_SUPPORT_MULTI_TOUCH` | 0 | 多点触控(双指 + 滚轮) |
| `EGUI_CONFIG_FUNCTION_SUPPORT_KEY` | 0 | 硬件按键事件 |
| `EGUI_CONFIG_FUNCTION_SUPPORT_FOCUS` | 0 | 键盘焦点导航(依赖 KEY) |
### UI 特效
| 宏 | 默认 | 说明 |
|----|------|------|
| `EGUI_CONFIG_FUNCTION_SUPPORT_SHADOW` | 0 | 阴影渲染 |
| `EGUI_CONFIG_FUNCTION_SUPPORT_LAYER` | 0 | Z 轴图层系统 |
| `EGUI_CONFIG_FUNCTION_SUPPORT_SCROLLBAR` | 1 | 自动滚动条指示器 |
| `EGUI_CONFIG_FUNCTION_SUPPORT_DIRTY_PASSTHROUGH` | 0 | 容器透传脏区,用于减少复合控件刷新面积 |
| `EGUI_CONFIG_FUNCTION_WIDGET_ENHANCED_DRAW` | 0 | 增强渲染(渐变 + 阴影,自动开启两者) |
| `EGUI_CONFIG_FUNCTION_GRADIENT_DITHERING` | 0 | 渐变抖动(消除 16 位色带) |
### 抗锯齿质量
| 宏 | 默认 | 说明 |
|----|------|------|
| `EGUI_CONFIG_CIRCLE_HQ_SAMPLE_2X2` | 0 | 2×2 快速采样(0 = 4×4 高质量) |
| `EGUI_CONFIG_LINE_HQ_SAMPLE_2X2` | 0 | 同上,用于线段 |
### 性能 / 内存
| 宏 | 默认 | 说明 |
|----|------|------|
| `EGUI_CONFIG_PFB_BUFFER_COUNT` | 2 | PFB 缓冲数(≥2 支持 DMA 流水线) |
| `EGUI_CONFIG_MAX_DISPLAY_COUNT` | 1 | display/core 数量,多屏示例设为 2 |
| `EGUI_CONFIG_MAX_FPS` | 60 | 帧率上限 |
| `EGUI_CONFIG_DIRTY_AREA_COUNT` | 5 | 脏矩形区域槽位数 |
| `EGUI_CONFIG_PERFORMANCE_USE_FLOAT` | 0 | 有 FPU 时启用浮点加速 |
| `EGUI_CONFIG_COLOR_16_SWAP` | 0 | RGB565 字节交换,作为默认 runtime 值 |
| `EGUI_CONFIG_FUNCTION_SOFTWARE_ROTATION_ENABLE` | 0 | 软件旋转编译裁剪开关,同时也是默认 runtime 值 |
多屏或异构屏场景下,`EGUI_CONFIG_COLOR_16_SWAP` 更推荐通过 `egui_display_setup_t.render_config` 按 core 覆盖;
软件旋转则建议通过 `egui_display_setup_t.render_config->software_rotation` 逐 core 覆盖;`EGUI_CONFIG_PFB_BUFFER_COUNT` 当前有效范围为 `1..4`。
### 资源 / 图片
| 宏 | 默认 | 说明 |
|----|------|------|
| `EGUI_CONFIG_FUNCTION_EXTERNAL_RESOURCE` | 0 | 启用外部资源读取,自动启用资源管理器 |
| `EGUI_CONFIG_FUNCTION_RESOURCE_MANAGER` | 0 | 资源管理器 |
| `EGUI_CONFIG_FUNCTION_IMAGE_CODEC_QOI` | 0 | QOI 图片解码 |
| `EGUI_CONFIG_FUNCTION_IMAGE_CODEC_RLE` | 0 | RLE 图片解码 |
| `EGUI_CONFIG_FUNCTION_IMAGE_RUNTIME_SVG` | 0 | 运行时 SVG 渲染,需要 RGB565 和 RGB565_8 图片格式支持 |
### 主题系统
通过 `EGUI_THEME_*` 宏统一管理全局视觉风格,所有控件从同一套设计令牌取色。
| 令牌 | 默认值 | 语义 |
|------|--------|------|
| `EGUI_THEME_PRIMARY` | `#2563EB` | 主题蓝(按钮 / 选中) |
| `EGUI_THEME_SECONDARY` | `#14B8A6` | 次要色(Teal) |
| `EGUI_THEME_SUCCESS` | `#16A34A` | 成功(绿) |
| `EGUI_THEME_WARNING` | `#F59E0B` | 警告(琥珀) |
| `EGUI_THEME_DANGER` | `#DC2626` | 危险(红) |
| `EGUI_THEME_SURFACE` | `#FFFFFF` | 控件背景 |
| `EGUI_THEME_TEXT_PRIMARY` | `#111827` | 正文颜色 |
| `EGUI_THEME_TEXT_SECONDARY` | `#6B7280` | 辅助文字颜色 |
| `EGUI_THEME_FOCUS` | PRIMARY | 焦点环颜色 |
| `EGUI_THEME_RADIUS_MD` | 10 px | 中等圆角半径 |
---
## 🛠️ UI Designer
UI Designer 桌面端和设计稿转换链路已经迁移到独立仓库 `EmbeddedGUI_Designer` 维护。
```
Figma / HTML / JSX ──→ XML ──→ C 源文件 (`uicode_disp0.c` / `uicode_disp0.h`)
```
- **当前仓库定位**:保留 SDK、运行时、资源生成、示例、文档,以及供 Designer 调用的 headless 预览端口
- **Designer 仓库定位**:维护桌面设计器、设计稿导入、XML 编辑和预览打包
- **Designer 入口**:见 `doc/source/ui_designer/index.rst`

### 字体 / 图像
**字体**:资源字体(`egui_font_std`),内置 Montserrat,UTF-8 解码,支持多行对齐。
**图像格式**:RGB32(ARGB8888)、RGB565、RGB565 调色板(1/2/4/8 bit)、Alpha 遮罩(1/2/4/8 bit),全部可按需关闭以节省 ROM。
---
## 🔧 工具链
| 工具 | 命令 | 说明 |
|------|------|------|
| 构建 | `make all APP=` | 编译指定示例 |
| 运行 | `make run` | 启动 PC 模拟器 |
| 资源生成 | `make resource_refresh APP=` | 生成字体 / 图片 C 文件 |
| 运行时验证 | `python scripts/code_runtime_check.py --app [--app-sub ]` | 截图验证渲染正确性 |
| 体积分析 | `python scripts/size_analysis/main.py --case-set typical` | 生成 qemu 口径 ROM/RAM/heap/stack 报告 |
| 性能分析 | `python scripts/perf_analysis/main.py --profile cortex-m3` | 生成 QEMU 微秒级性能报告 |
| CI 编译检查 | `python scripts/code_compile_check.py --full-check` | 全量编译检查 |
| 发布前检查 | `python scripts/release_check.py --scope multi-display` | 多屏编译、运行、文档专项回归 |
---
## 📦 资源占用
以下为 `doc/source/size/size_report.md` 中的 QEMU 口径快照:`PORT=qemu CPU_ARCH=cortex-m0plus`,静态体积只统计仓库侧 `src/` + `example/` 对象,运行期 heap/stack 由 QEMU 录制动作测得。
| App | Code | Resource | RAM | PFB | Heap Peak | Stack Peak | Total ROM |
|-----|------|----------|-----|-----|-----------|------------|-----------|
| HelloSimple | 15340 | 2506 | 169 | 2400 | 0 | 820 | 17846 |
| HelloBasic(button) | 26284 | 18289 | 521 | 4800 | 276 | 1168 | 44573 |
| HelloBasic(label) | 21548 | 6341 | 380 | 4800 | 276 | 1096 | 27889 |
| HelloBasic(list) | 30504 | 15742 | 1734 | 4800 | 276 | 1312 | 46246 |
| HelloBasic(mask) | 84732 | 43714 | 564 | 4800 | 320 | 4080 | 128446 |
| HelloBasic(textinput) | 40828 | 16004 | 3722 | 4800 | 276 | 1200 | 56832 |
| HelloBasic(svg) | 35320 | 9502 | 749 | 2400 | 29266 | 2832 | 44822 |
| HelloPerformance | 270924 | 1834759 | 3017 | 1536 | 5336 | 432 | 2105683 |
| HelloShowcase | 166648 | 70159 | 14608 | 40960 | 276 | 2440 | 236807 |
| HelloStyleDemo | 127904 | 102545 | 5906 | 19200 | 276 | 2640 | 230449 |
| HelloVirtual(virtual_stage_showcase) | 190044 | 72303 | 8127 | 40960 | 3256 | 2672 | 262347 |
> 运行 `python scripts/size_analysis/main.py --case-set typical` 生成最新报告;再运行 `python scripts/size_analysis/main.py size-to-doc` 刷新 `doc/source/size/` 文档。
---
## 📚 示例应用(22 个)
| 示例 | 说明 |
|------|------|
| `HelloSimple` | 最小 Hello World |
| `HelloActivity` | Activity 生命周期演示 |
| `HelloAPP` | 完整多页面应用 |
| `HelloBasic` | **66 个独立控件 / 专项验证演示** |
| `HelloVirtual` | **19 个 Virtual 控件示例** |
| `HelloCanvas` | 绘图图元展示 |
| `HelloChart` | 图表控件演示 |
| `HelloGradient` | 渐变填充效果 |
| `HelloLayer` | Z 轴图层演示 |
| `HelloMultiDisplay` | 双屏 Activity 与多 core 录制验证 |
| `HelloMultiDisplayHetero` | 主副异构屏与跨 core 同步验证 |
| `HelloStyleDemo` | 主题 / 增强样式演示 |
| `HelloPerformance` | FPS / 性能基准 |
| `HelloPFB` | PFB 渲染演示 |
| `HelloResourceManager` | 外部资源管理器 |
| `HelloEasyPage` | EasyPage API 演示 |
| `HelloShowcase` | UI 全景展示 |
| `HelloSizeAnalysis` | 体积分析 probe 和配置模板 |
| `HelloSVGSpec` | SVG 运行时渲染规范对比基座 |
| `HelloTest` | PC 调试与动态渲染测试场景 |
| `HelloUnitTest` | 单元测试 |
| `HelloViewPageAndScroll` | 翻页 + 滚动演示 |
---
## 📝 写在最后
作为芯片从业人员,国产芯片资源有限(512 KB ROM、20 KB RAM、96 MHz CPU),需要跑手环级别的触控 GUI。评估了 [GuiLite](https://github.com/idea4good/GuiLite)(无 PFB)、[Arm-2D](https://github.com/ARM-software/Arm-2D)(无控件管理)、[LVGL](https://github.com/lvgl/lvgl)(资源需求太高),各有优势但都不完全满足需求,最终决定自己写一套——什么都可控,极限优化。
现在有 AI 加持,渐变、KEY 输入、Focus 系统、Layer、UI Designer 等功能不断加入,框架越来越好用,也更方便维护。
---
## 🔗 相关链接
- 在线体验:https://embeddedgui.github.io/EmbeddedGUI/
- 文档:https://embeddedgui.readthedocs.io/en/latest/
- Gitee:https://gitee.com/embeddedgui/EmbeddedGUI
- GitHub:https://github.com/EmbeddedGUI/EmbeddedGUI
---
## 💬 社区
欢迎大家入群交流讨论。
 QQ
|