低 RAM 配置宏说明文档¶
本文档梳理 HelloPerformance 等低 RAM 场景中使用的细粒度配置宏,说明每个宏的作用机制、默认值、及在 HelloPerformance 下的设定与 RAM 节省效果。
所有宏均可在应用的 app_egui_config.h 中覆盖,不影响其他应用的默认行为。
说明:下文 HelloPerformance 列同时包含“当前 shipped 默认”与“历史 low-RAM 实验值”。当前默认始终以 example/HelloPerformance/app_egui_config.h 为准;若某项已被回退为默认值,会在对应小节里单独说明。
一、图像解码相关宏¶
1. EGUI_CONFIG_IMAGE_STD_ALPHA_OPAQUE_CACHE_SLOTS¶
位置: src/image/egui_image_std.c
2026-04-06起,这个名字不再是当前框架 public 配置入口;当前主线已把它内收为src/image/egui_image_std.c里的实现私有常量,默认行为固定为4。下面保留的是历史 A/B 记录,便于说明为什么它不再值得暴露成公共宏。
属性 |
值 |
|---|---|
默认值 |
当前实现内固定 |
HelloPerformance |
当前随实现内固定 |
RAM 类型 |
BSS |
HP 节省 |
~33 B |
机制: 缓存”某张 RGB565+alpha 图片的 alpha 通道是否全为不透明”的探测结果,跨帧复用以跳过逐行扫描,走更快的纯 RGB565 合成路径。SLOTS 槽数控制最多缓存多少张图片的结论,采用轮转淘汰。
设为 0 时整个 cache 数组不编译,每次绘制均重新扫描。
2026-04-04 基于当前 HelloPerformance 主线重新做完整 A/B 后,结论更新为:
关闭后
HelloPerformance text 2055380 -> 2055224,回收text -156B、bss -40B完整
239perf 场景里没有任何>=10%回退,只有EXTERN_IMAGE_RESIZE_TILED_565_8 -11.4%这一处>=10%改善基础
RECTANGLE / CIRCLE / ROUND_RECTANGLE / TEXT / IMAGE_565 / EXTERN_IMAGE_565 / IMAGE_RESIZE_565 / EXTERN_IMAGE_RESIZE_565全部保持在噪声内但 runtime
4 vs 0有8帧真实像素差:frame_0066~0069、frame_0095~0098额外控制组
4 vs 4repeat 为hash mismatch 0、pixel mismatch 0,说明这不是录制噪声HelloUnitTeston / off 仍是688/688 passed
因此这颗宏当前默认继续保持 4。但它的收益也只有 text -156B, bss -40B,远低于当前“单颗 public 宏至少要值得 >1KB code-size 回收”的门槛;同时 0 路径在当前主线仍会带来 8 帧真实渲染差异,所以这个名字已不再保留为 public 宏入口,只保留历史 A/B 记录。
数据结构(默认 SLOTS=4 时):
static egui_image_std_alpha_opaque_cache_t g_egui_image_std_alpha_opaque_cache[4]; // 4×8B
static uint8_t g_egui_image_std_alpha_opaque_cache_next; // 1B
2. EGUI_CONFIG_IMAGE_DECODE_MAX_PIXEL_SIZE¶
位置: src/config/egui_config_default.h
属性 |
值 |
|---|---|
默认值 |
当前默认 |
HelloPerformance |
当前直接继承默认 |
RAM 类型 |
heap(动态峰值) |
HP 节省 |
相比历史 |
机制:
决定 codec 行缓存和单行 pixel scratch 的最大字节上界(PFB 行宽度 × 屏幕宽度 × 本宏)。当前框架默认已经收窄到 2,因为 HelloPerformance 当前压缩图像资产均为纯 RGB565,不含 RGBA32;4 仅保留为历史默认/对比值,用于需要 RGBA32 decode 上界的场景。
公式:
codec_row_cache_pixel_max = PFB_HEIGHT × SCREEN_WIDTH × EGUI_CONFIG_IMAGE_DECODE_MAX_PIXEL_SIZE
当前默认/HelloPerf(PFB=16×16): 16 × 240 × 2 = 7,680 B
历史默认 4 在相同 PFB 下: 16 × 240 × 4 = 15,360 B
差值: 7,680 B
2026-04-05 按当前主线完成 2 -> 4 全量 A/B 后,结果为:
size:
text 2055380 -> 2055488,即text +108B,bss不变perf:完整
239场景没有任何>=10%回退或<=-10%改善,最大绝对波动仅IMAGE_TILED_QOI_565_8 -0.325%基础
RECTANGLE / CIRCLE / ROUND_RECTANGLE / TEXT / IMAGE_565 / EXTERN_IMAGE_565 / IMAGE_RESIZE_565 / EXTERN_IMAGE_RESIZE_565全部+0.0%runtime / unit:
HelloPerformance两侧都是241 frames且hash mismatch 0、pixel mismatch 0;HelloUnitTest两侧都是688/688 passed
因此当前 shipped/default 应记为 2,4 只保留为历史默认/外部 A/B 对比值,不再视为 HelloPerformance 的 active app-side override。
3. EGUI_CONFIG_IMAGE_DECODE_OPAQUE_ALPHA_ROW_USE_ROW_CACHE¶
位置: src/image/egui_image_decode_utils.h,使用处 src/image/egui_image_decode_utils.c
2026-04-06起,这个名字不再是当前框架 public 配置入口;当前主线已把它内收为实现私有常量,默认行为固定为0。下面保留的是历史 A/B 记录,便于说明为什么它不再值得暴露成公共宏。
属性 |
值 |
|---|---|
默认值 |
当前实现内固定 |
HelloPerformance |
当前随实现内固定 |
RAM 类型 |
heap(节省独立分配) |
HP 节省 |
~248 B(240B data + 8B 指针) |
依赖 |
需 |
机制:
带 mask 的不透明 RGB565 图绘制时需要一行”全 255 alpha”参考缓冲用于合成回退。设为 0 时单独在 heap 上分配并跨帧持久;设为 1 时直接复用已存在的 codec row cache 的 alpha 缓冲头部,省去独立的 240 B 持久堆分配。
2026-04-04 基于当前 HelloPerformance 主线重新做完整 A/B 后,结论更新为:
历史实验值
1相比当前默认0为text -132B, bss -8B完整
239perf 场景里没有任何>=10%回退或改善,最大绝对波动仅±0.4%基础主路径
RECTANGLE / CIRCLE / ROUND_RECTANGLE / TEXT / IMAGE_565 / EXTERN_IMAGE_565 / IMAGE_RESIZE_565 / EXTERN_IMAGE_RESIZE_565全部+0.0%runtime
241帧hash mismatch 0、pixel mismatch 0HelloUnitTeston / off 都是688/688 passed
因此这颗宏当前不应再写成 HelloPerformance=1 的 active override。对 HelloPerformance 而言,1 现阶段更适合作为行为等价、收益很小的历史条件实验值;当前 shipped/default 继续记为 0。由于它最多也只是在 text -132B, bss -8B 量级做取舍,远低于当前“单颗 public 宏至少要值得 >1KB code-size 回收”的门槛,这个名字已不再保留为 public 宏入口。
4. EGUI_CONFIG_FUNCTION_IMAGE_CODEC_FAST_DRAW¶
位置: src/image/egui_image_qoi.c,src/image/egui_image_rle.c
补充:2026-04-06 起,EGUI_CONFIG_IMAGE_CODEC_TAIL_ROW_CACHE_MAX_COLS 已内收为实现私有固定值 0。历史把 tail cap 压到 184/176/144/96 的 A/B 没有任何 code-size 收益,反而会让当前 240px 图宽、PFB_WIDTH=48 横向 walk 下的 QOI/RLE alpha 热点出现 +45% ~ +66% 乃至数倍回退,因此不再保留 public 入口。
属性 |
值 |
|---|---|
默认值 |
|
HelloPerformance |
当前 shipped |
RAM 类型 |
heap(峰值减小) |
HP 节省 |
|
机制:
EGUI_CONFIG_FUNCTION_IMAGE_CODEC_FAST_DRAW 现在统一承载 3 档策略:
0:关闭 codec row-cache fast path1:启用 full row-band cache fast path2:启用 tail-row low-RAM fast path(隐含保留 row-cache 主路径)
其中标准 row-band 模式会让第一个 PFB tile 解码全图宽的当前行带并缓存,后续水平 tile 直接读缓存;tail 模式则让第一个 PFB tile 的像素从 scratch 流式解码并渲染,只把“后续 tile 尚未用到的尾列”写入 row cache。
在 240px 宽、48px PFB 步宽的场景下,第一 tile 占 48 列,尾部 192 列进入缓存,节省首 tile 的 16×48×3 = 2304 B 峰值堆分配。
2026-04-04 基于当前主线重新做完整 A/B 后,结论可以拆成两层理解:
0 -> 1会额外带来约
text +5108B但如果关闭到
0,完整239perf 场景里会有4个>=10%回退,全部集中在 internal tiledQOI/RLE
1 -> 2会再额外带来
HelloPerformance text +9976B但能把 tail-row 路径重新打开,并在
240px / PFB_WIDTH=48条件下再省下约2304B峰值堆
当前 shipped
1相比历史 low-RAM 实验值2,在完整239perf 场景里会有40个>=10%回退回退全部集中在
QOI/RLE压缩图主路径及其 masked 变体:IMAGE_QOI_565 +168.2%EXTERN_IMAGE_QOI_565 +189.9%IMAGE_RLE_565 +121.3%EXTERN_IMAGE_RLE_565 +141.3%MASK_IMAGE_QOI_NO_MASK +168.2%EXTERN_MASK_IMAGE_QOI_NO_MASK +189.9%MASK_IMAGE_RLE_NO_MASK +121.3%EXTERN_MASK_IMAGE_RLE_NO_MASK +141.3%
基础
RECTANGLE / CIRCLE / ROUND_RECTANGLE / TEXT / IMAGE_565 / EXTERN_IMAGE_565 / IMAGE_RESIZE_565 / EXTERN_IMAGE_RESIZE_565都是+0.0%runtime
241帧和HelloUnitTest 688/688仍保持等价
因此这颗宏现在不能再按“单一布尔开关”理解:1 是当前 HelloPerformance shipped 的 full row-band 模式,2 是历史 low-RAM tail-row 候选值;如果后续需要重新平衡 codec heap 与压缩图吞吐,这仍是优先级很高的一颗重评估宏。
5. EGUI_CONFIG_IMAGE_QOI_INDEX_RGB565_CACHE_ENABLE¶
位置: src/image/egui_image_qoi.c
2026-04-06起,这个名字不再是当前框架 public 配置入口;当前主线已把它内收为实现私有常量,默认行为固定为1。下面保留的是历史 A/B 记录,便于说明为什么它不再值得暴露成公共宏。
属性 |
值 |
|---|---|
默认值 |
当前实现内固定 |
HelloPerformance |
当前随实现内固定 |
RAM 类型 |
heap(QOI decode state 内部) |
HP 节省 |
~128 B / 每个活跃解码实例 |
机制: QOI 解码器维护 64 个历史色彩槽(RGBA index,256 B)。启用时额外维护对应的 RGB565 预转换版本(128 B),INDEX 操作命中时无需重新做 RGB888→RGB565 转换;禁用时节省 128 B heap,每次 INDEX 命中时实时计算颜色转换(代价极小)。
2026-04-04 基于当前 HelloPerformance 主线重新做完整 A/B 后,结论更新为:
关闭后
HelloPerformance text 2055380 -> 2055316,只回收text -64B,最终 ELFbss不变完整
239perf 场景里没有任何>=10%回退或改善基础
RECTANGLE / CIRCLE / ROUND_RECTANGLE / TEXT / IMAGE_565 / EXTERN_IMAGE_565 / IMAGE_RESIZE_565 / EXTERN_IMAGE_RESIZE_565全部+0.0%最大绝对波动仍在噪声内,集中在 QOI 路径:
IMAGE_QOI_565 +2.8%MASK_IMAGE_QOI_NO_MASK +2.8%MASK_IMAGE_QOI_ROUND_RECT +2.7%MASK_IMAGE_QOI_CIRCLE +2.6%EXTERN_MASK_IMAGE_QOI_IMAGE -1.7%EXTERN_IMAGE_QOI_565 -1.2%EXTERN_MASK_IMAGE_QOI_NO_MASK -1.2%
runtime
241帧和HelloUnitTest 688/688仍保持等价
因此这颗宏当前默认继续保持 1。但它的收益也只有每个活动 QOI decode 实例 ~128B heap,同时关闭后只能回收 text -64B,远低于当前“单颗 public 宏至少要值得 >1KB code-size 回收”的门槛;所以这个名字已不再保留为 public 宏入口,只保留历史 A/B 记录。
6. EGUI_CONFIG_IMAGE_QOI_COMPACT_RGB565_INDEX_ENABLE¶
位置: src/image/egui_image_qoi.c
2026-04-06起,这个名字不再是当前框架 public 配置入口;当前主线已把它内收为src/image/egui_image_qoi.c里的实现私有常量,默认行为固定为0。下面保留的是历史 A/B 记录,便于说明为什么它不再值得暴露成公共宏。
属性 |
值 |
|---|---|
默认值 |
当前实现内固定 |
HelloPerformance |
当前随实现内固定 |
RAM 类型 |
heap(QOI decode state) |
HP 节省 |
~192 B / 每个活跃解码实例 |
机制:
将 QOI 的 64 项颜色索引表从标准 uint32_t index_rgba[64](256 B)替换为紧凑版 uint16_t index_rgb565[64] + uint8_t index_aux[64](共 192 B)。专为纯 RGB565 图源设计,辅助字节存放 alpha 或速度偏置信息,重建 RGB888 时从 RGB565 规范扩展推算,与 RGB565_CACHE=0 联用。
对比当前默认(compact=0, rgb565_cache=1)的 404 B,compact 配置只占 212 B,净省 192 B。
2026-04-04 基于当前 HelloPerformance 主线重新做完整 A/B 后,结论已经更新:
开启后
HelloPerformance text +780B完整
239perf 场景里有10个>=10%回退,全部集中在QOI RGB565主路径IMAGE_QOI_565 +52.2%EXTERN_IMAGE_QOI_565 +19.3%MASK_IMAGE_QOI_NO_MASK +52.2%EXTERN_MASK_IMAGE_QOI_NO_MASK +19.3%
runtime
241帧和HelloUnitTest 688/688仍保持等价
因此这颗宏当前默认继续保持 0。但它的收益只有每个活动实例 ~192B heap,同时开启还会带来 text +780B 并在当前主线稳定打穿 QOI RGB565 主路径,远低于当前“单颗 public 宏至少要值得 >1KB code-size 回收”的门槛;所以这个名字已不再保留为 public 宏入口,只保留历史 A/B 记录。
7. EGUI_CONFIG_IMAGE_QOI_ROW_INDEX_8BIT_ENABLE¶
位置: src/image/egui_image_qoi.c
2026-04-06起,这个名字不再是当前框架 public 配置入口;当前主线已把它内收为实现私有常量,默认行为固定为0。下面保留的是历史 A/B 记录,便于说明为什么它不再值得暴露成公共宏。
属性 |
值 |
|---|---|
默认值 |
当前实现内固定 |
HelloPerformance |
当前随实现内固定 |
RAM 类型 |
heap(decode state 内字段) |
HP 节省 |
历史 |
机制:
QOI 解码状态结构体中 current_row(行游标)的整数宽度。降至 uint8_t 要求图片高度不超过 255 行。HelloPerformance 的 QOI 资源最高 240 行,满足条件。
2026-04-05 按当前主线完成 0 -> 1 全量 A/B 后,结果为:
size:
text 2055380 -> 2055392,即text +12B,bss不变perf:完整
239场景没有任何>=10%回退或<=-10%改善,最大绝对波动仅IMAGE_TILED_QOI_565_0 +0.551%QOI 主路径也都在噪声内:
IMAGE_QOI_565 +0.016%、EXTERN_IMAGE_QOI_565 -0.006%、IMAGE_QOI_565_8 -0.047%、EXTERN_IMAGE_QOI_565_8 -0.074%runtime / unit:
HelloPerformance两侧都是241 frames且hash mismatch 0、pixel mismatch 0;HelloUnitTest两侧都是688/688 passed
因此当前 shipped/default 继续记为 0;1 只保留为历史低 RAM 对比值,不再作为 HelloPerformance 的 active app-side override。由于收益只到每个解码实例 ~2~4B heap 级别,同时完全拿不到 code-size 收益,这个名字已不再保留为 public 宏入口。
二、外部资源行缓存共享宏¶
这组宏协同工作,通过逐步合并/复用缓冲区来减少 RAM 占用。
注意: 原宏
EGUI_CONFIG_IMAGE_EXTERNAL_ROW_CACHE_SHARE_BUFFERS(宏8)和EGUI_CONFIG_IMAGE_EXTERNAL_SHARED_CACHE_USE_CODEC_ROW_CACHE(宏9)已被移除。
共享模式现在强制启用,std/transform/rle 三路共用一份后备存储,通过 generation 计数自动失效旧缓存。
后备存储改为 heap 动态分配(首次使用时分配),未使用外部资源时 RAM 占用为 0。
不再需要用户判断 std 和 codec 场景是否混用。
8. EGUI_CONFIG_IMAGE_STD_EXTERNAL_ROW_PERSISTENT_CACHE_ENABLE¶
位置: src/image/egui_image_std.c
2026-04-06起,这个名字不再是当前框架 public 配置入口;当前主线已把它内收为实现私有常量,默认行为固定为1。下面保留的是历史 A/B 记录,便于说明为什么它不再值得暴露成公共宏。
属性 |
值 |
|---|---|
默认值 |
当前实现内固定 |
HelloPerformance |
当前随实现内固定 |
RAM 类型 |
BSS |
HP 节省 |
历史 |
机制:
外部 std 图像行块缓存的元数据(chunk 起始行、行数、行字节数、图片指针等)是否存放在全局 BSS。设为 1 跨 tile 保留行位置信息,减少 semihosting I/O 次数;设为 0 元数据转为调用栈局部变量,BSS 消去,代价是每次 draw 调用重建(HP 场景影响不大)。
2026-04-05 按当前主线完成 1 -> 0 全量 A/B 后,结果为:
size:
text 2055380 -> 2055400,即text +20B,bss 3832 -> 3792perf:完整
239场景没有任何>=10%回退或<=-10%改善,最大绝对波动仅EXTERN_IMAGE_RESIZE_TILED_565_0 +2.467%基础主路径保持在噪声内:
RECTANGLE / CIRCLE / ROUND_RECTANGLE / TEXT全部+0.0%,IMAGE_565 +1.674%、EXTERN_IMAGE_565 +0.959%、IMAGE_RESIZE_565 +0.0%、EXTERN_IMAGE_RESIZE_565 +0.789%external codec 热点也保持稳定:
EXTERN_IMAGE_QOI_565 +0.0%、EXTERN_IMAGE_RLE_565 +0.0%、EXTERN_MASK_IMAGE_QOI_IMAGE -0.03%、EXTERN_MASK_IMAGE_RLE_IMAGE +0.0%runtime / unit:
HelloPerformance两侧都是241 frames且hash mismatch 0、pixel mismatch 0;HelloUnitTest两侧都是688/688 passed
因此当前 shipped/default 继续记为 1;0 只保留为低优先级 low-RAM 条件实验值,不再作为 HelloPerformance 的 active app-side override。由于它只是在 text +20B / bss -40B 量级上做取舍,这个名字已不再保留为 public 宏入口。
9. EGUI_CONFIG_IMAGE_TRANSFORM_EXTERNAL_ROW_PERSISTENT_CACHE_ENABLE¶
位置: src/canvas/egui_canvas_transform.c
2026-04-06起,这个名字不再是当前框架 public 配置入口;当前主线已把它内收为实现私有常量,默认行为固定为1。下面保留的是历史 A/B 记录,便于说明为什么它不再值得暴露成公共宏。
属性 |
值 |
|---|---|
默认值 |
当前实现内固定 |
HelloPerformance |
当前随实现内固定 |
RAM 类型 |
BSS |
HP 节省 |
历史 |
机制:
与宏 8 对称,负责 transform(rotate/scale)路径的外部图片行缓存元数据。默认两个全局 slot 各持行块状态;设为 0 后 slot 嵌入各 draw 调用的栈局部 image_transform_external_source_t,BSS 释放。
2026-04-05 按当前主线完成 1 -> 0 全量 A/B 后,结果为:
size:
text 2055380 -> 2055356,即text -24B,bss 3832 -> 3776perf:完整
239场景没有任何>=10%回退或<=-10%改善,最大绝对波动仅EXTERN_IMAGE_ROTATE_565_1 -1.316%基础主路径保持在噪声内:
RECTANGLE +0.0%、CIRCLE -0.123%、ROUND_RECTANGLE +0.0%、TEXT -0.097%、IMAGE_565 +0.0%、EXTERN_IMAGE_565 +0.0%、IMAGE_RESIZE_565 +0.0%、EXTERN_IMAGE_RESIZE_565 +0.0%transform/rotate 侧也保持稳定:
IMAGE_ROTATE_565 +0.429%、IMAGE_ROTATE_565_8 +0.358%、IMAGE_ROTATE_TILED_565_0 +0.791%、EXTERN_IMAGE_ROTATE_TILED_565_0 +0.360%runtime / unit:
HelloPerformance两侧都是241 frames且hash mismatch 0、pixel mismatch 0;HelloUnitTest两侧都是688/688 passed
因此当前 shipped/default 继续记为 1;0 只保留为低优先级 low-RAM 条件实验值,不再作为 HelloPerformance 的 active app-side override。由于它的收益也只有 text -24B / bss -56B 这一档,这个名字已不再保留为 public 宏入口。
三、RLE 外部资源 I/O 窗口宏¶
10. EGUI_CONFIG_IMAGE_RLE_EXTERNAL_CACHE_WINDOW_SIZE¶
位置: src/image/egui_image_rle.c
属性 |
值 |
|---|---|
默认值 |
|
HelloPerformance |
当前默认 |
RAM 类型 |
BSS 或 transient frame heap(取决于宏11) |
HP 节省 |
~960 B(当前实测 |
机制:
RLE 外部资源解码时,控制字节(操作码+长度字段)具有强局部性,缓存 WINDOW_SIZE 字节可大量减少 semihosting I/O 调用。像素字面量行(240px × 2B = 480 B)超过窗口大小时自动走直接 load,正确性不受影响。历史上 HelloPerformance 曾把它缩到 64B,用于 low-RAM 外部 RLE 实验。
2026-04-04 基于当前 HelloPerformance 主线重新做完整 A/B 后,结论更新为:
1024 -> 64后HelloPerformance text 2055380 -> 2055476,同时bss 3832 -> 2808即缩小窗口会带来
text +96B,但能回收bss -1024B完整
239perf 场景里有5个>=10%回退,全部集中在 external RLE 主路径及其 masked 变体:EXTERN_IMAGE_RLE_565 +21.8%EXTERN_MASK_IMAGE_RLE_NO_MASK +21.8%EXTERN_MASK_IMAGE_RLE_ROUND_RECT +20.8%EXTERN_MASK_IMAGE_RLE_CIRCLE +20.3%EXTERN_MASK_IMAGE_RLE_IMAGE +17.5%
EXTERN_IMAGE_RLE_565_8 / EXTERN_MASK_IMAGE_RLE_8_*也有+8.1% ~ +9.4%的稳定回退基础
RECTANGLE / CIRCLE / ROUND_RECTANGLE / TEXT / IMAGE_565 / EXTERN_IMAGE_565 / IMAGE_RESIZE_565 / EXTERN_IMAGE_RESIZE_565全部+0.0%runtime
241帧hash mismatch 0、pixel mismatch 0HelloUnitTeston / off 仍是688/688 passed
因此这颗宏当前适合保留为 low-RAM 条件实验宏,但不适合作为 HelloPerformance shipped 默认值。若项目明确不关心 external RLE 热点,64 仍然是能稳定回收约 1KB BSS 的选项。
注:当前实现下,宏 10 与宏 11 的组合不再把 external RLE window 放到 draw 调用栈上;关闭 persistent cache 时,window 会改走 transient frame heap。
11. EGUI_CONFIG_IMAGE_RLE_EXTERNAL_WINDOW_PERSISTENT_CACHE_ENABLE(已内收)¶
位置: src/image/egui_image_rle.c
属性 |
值 |
|---|---|
默认值 |
|
HelloPerformance |
当前实现内固定 |
RAM 类型 |
BSS -> transient frame heap |
HP 实测 |
|
机制:
控制 external RLE read window 是否常驻在全局 BSS。设为 0 后,当前实现会把 window 本体改成每帧复用的 transient heap buffer,并在 egui_image_rle_release_frame_cache() 里释放,不再把整块 window 放到 draw 调用栈上。
2026-04-06起,这个名字不再是当前框架 public 配置入口;当前主线已把它内收到src/image/egui_image_rle.c的实现私有常量,默认行为固定为1。下面保留的是历史 A/B 记录,用来说明为什么它不再值得继续保留成公共宏。
先纠正当前 shipped 关系:
框架默认值是
1HelloPerformance当前 shipped 配置也直接继承这个默认值历史实验值
0现在只保留为旧 A/B 记录,不再是当前 app-side override
2026-04-05 基于当前 HelloPerformance 主线重新做完整 A/B 后,结论更新为:
1 -> 0后HelloPerformance text 2055380 -> 2056196,bss 3832 -> 2792即关闭 persistent cache 会带来
text +816B,但能回收bss -1040B完整
239perf 场景里没有任何>=10%回退或改善,最大绝对波动是IMAGE_TILED_RLE_565_0 +6.18%基础
RECTANGLE / CIRCLE / ROUND_RECTANGLE / TEXT / IMAGE_565 / EXTERN_IMAGE_565 / IMAGE_RESIZE_565 / EXTERN_IMAGE_RESIZE_565都在噪声内internal
IMAGE_RLE_565 / IMAGE_RLE_565_8 / MASK_IMAGE_RLE_*基本都在+0.4%内IMAGE_TILED_RLE_565_0 +6.2%、IMAGE_TILED_RLE_565_8 +2.8%external
EXTERN_IMAGE_RLE_565 / EXTERN_MASK_IMAGE_RLE_NO_MASK +5.1%EXTERN_MASK_IMAGE_RLE_ROUND_RECT +4.8%、EXTERN_MASK_IMAGE_RLE_CIRCLE +4.7%EXTERN_MASK_IMAGE_RLE_IMAGE +3.7%EXTERN_IMAGE_RLE_565_8 / EXTERN_MASK_IMAGE_RLE_8_NO_MASK +3.1%EXTERN_MASK_IMAGE_RLE_8_ROUND_RECT +2.8%、EXTERN_MASK_IMAGE_RLE_8_CIRCLE +2.7%、EXTERN_MASK_IMAGE_RLE_8_IMAGE +2.7%runtime
241帧hash mismatch 0、pixel mismatch 0HelloUnitTeston / off 仍是688/688 passed
结论:这颗宏当前已从 public 配置面内收,默认 shipped 行为仍固定为 1。历史实验值 0 虽然能把 external RLE window 从 persistent BSS 切到 transient frame heap,并回收 bss -1040B,但会带来 text +816B,且 tiled / external RLE 仍有 +2.7% ~ +6.2% 的局部回退,因此现在只保留历史 A/B 记录。它与宏 10 的历史联动关系仍然成立:宏 10 决定 window 大小,宏 11 决定这块 window 历史上走 persistent BSS 还是 transient frame heap。
四、字体缓存宏¶
12. EGUI_CONFIG_FONT_STD_CODE_LOOKUP_CACHE_ASCII_COMPACT¶
2026-04-06起,这个名字不再是当前框架 public 配置入口;当前主线已把它内收为实现私有常量,默认行为固定为0。下面保留的是历史 A/B 记录,便于说明为什么它不再值得暴露成公共宏。
属性 |
值 |
|---|---|
默认值 |
当前实现内固定 |
HelloPerformance |
当前随实现内固定 |
RAM 类型 |
data(静态缓存槽位) |
HP 节省 |
历史 |
机制:
字体 code lookup 加速缓存(g_font_std_code_lookup_cache),记录上次命中的 ASCII 码及其字形表下标,加速有序 code 数组的二分查找。Compact 模式将内部字段压缩为 uint8_t,适用于纯 ASCII(code ≤ 255)字体,每 slot 从约 32 B 压缩到约 12 B。
2026-04-05 按当前主线完成 0 -> 1 全量 A/B 后,结果为:
size:
text 2055380 -> 2055580、data 72 -> 52、bss不变即历史
1虽然回收了data -20B,但同时带来text +200Bperf:完整
239场景没有任何>=10%回退或<=-10%改善,最大绝对波动仅TEXT_GRADIENT +1.293%文本主路径也都在噪声内:
TEXT +0.0%、EXTERN_TEXT +0.0%、TEXT_ROTATE +0.0%、EXTERN_TEXT_ROTATE +0.0%、TEXT_RECT +0.570%、EXTERN_TEXT_RECT +0.524%runtime / unit:
HelloPerformance两侧都是241 frames且hash mismatch 0、pixel mismatch 0;HelloUnitTest两侧都是688/688 passed
因此当前 shipped/default 继续记为 0;1 只保留为历史低 RAM 对比值。由于它的实际收益只有 data -20B,同时还会引入 text +200B,这个名字已不再保留为 public 宏入口。
13. EGUI_CONFIG_FUNCTION_FONT_STD_FAST_DRAW¶
属性 |
值 |
|---|---|
默认值 |
当前默认 |
HelloPerformance |
当前直接继承默认 |
RAM 类型 |
heap + BSS(指针) |
HP 节省 |
当前只保留 |
机制:
EGUI_CONFIG_FUNCTION_FONT_STD_FAST_DRAW 现在是布尔开关:
0:关闭 std-font fast draw 以及其下的字体 fast/cache 路径1:启用完整 std-font fast draw,包括 ASCII 直查表
同时它也是字体 fast/cache 路径的总门控:code lookup cache、text transform prepare/layout cache、text transform size cache 以及 draw-prefix cache 都只在 EGUI_CONFIG_FUNCTION_FONT_STD_FAST_DRAW>=1 时才会实际编译生效。历史上的 code lookup / transform size 独立子开关已内收,不再作为 public 配置入口暴露。
ASCII 直查表会首次按需分配并跨帧复用,将 ASCII 字形查找从 O(log n) 降至 O(1)。历史上它曾作为 2 档独立启用,但该分层收益不大,当前已合并到 1,避免继续暴露过细的宏配置。
2026-04-25 按当前主线完成 1 -> 2 size/RAM 复测后,结果为:
size(
HelloPerformance PORT=qemu CPU_ARCH=cortex-m0plus):text 2293776 -> 2294832,data 2080 -> 2080,bss 7632 -> 7632即
2会带来text +1056B;静态data/bss在该镜像中不变runtime RAM:
sizeof(egui_font_std_ascii_lookup_cache_t)=268B,按需 heap 分配,另有 allocator overhead;egui_core_t理论上增加 4B,但当前链接 BSS 总量因对齐未增加结论:虽然总增量略高于
1KB,但分层收益不足以抵消配置复杂度,当前已合并为0/1布尔开关
2026-04-05 历史 perf A/B 结果为:
perf:完整
239场景没有任何>=10%回退,并有3个<=-10%改善主要改善集中在文本路径:
TEXT_GRADIENT -11.638%TEXT_RECT -11.597%TEXT_ROTATE_NONE -11.238%其余文本主路径也稳定改善或持平:
EXTERN_TEXT_RECT -5.628%、TEXT -0.974%、EXTERN_TEXT -0.376%、TEXT_ROTATE -0.041%、EXTERN_TEXT_ROTATE -0.076%
runtime / unit:
HelloPerformance两侧都是241 frames且hash mismatch 0、pixel mismatch 0;HelloUnitTest两侧都是688/688 passed
因此当前 shipped/default 记为 1;历史 2 的能力已并入 1,不再保留第二个 value。
14. EGUI_CONFIG_FONT_STD_ASCII_LOOKUP_INDEX_8BIT¶
2026-04-06起,这个名字不再是当前框架 public 配置入口;当前主线已把它内收为实现私有常量,默认行为固定为0。下面保留的是历史 A/B 记录,便于说明为什么它不再值得暴露成公共宏。
属性 |
值 |
|---|---|
默认值 |
当前实现内固定 |
HelloPerformance |
当前随实现内固定 |
RAM 类型 |
heap(ASCII cache 内部) |
HP 节省 |
历史 |
机制:
ASCII 直查表 ascii_index[128] 内部元素类型。0 使用 uint16_t,1 使用 uint8_t。只有在 EGUI_CONFIG_FUNCTION_FONT_STD_FAST_DRAW=1 时,这颗宏才会影响实际 heap 占用;它不改变查找逻辑,只影响缓存表元素宽度。
2026-04-05 按当前主线完成 0 -> 1 全量 A/B 后,结果为:
size:
text/data/bss全部不变,仍为2055380 / 72 / 3832perf:完整
239场景没有任何>=10%回退或<=-10%改善;当前结果逐项完全重合,基础TEXT / EXTERN_TEXT / TEXT_ROTATE / EXTERN_TEXT_ROTATE / TEXT_RECT / EXTERN_TEXT_RECT全部+0.0%runtime / unit:
HelloPerformance两侧都是241 frames且hash mismatch 0、pixel mismatch 0;HelloUnitTest两侧都是688/688 passed
因此当前 shipped/default 继续记为 0;1 只保留为历史低 RAM 对比值。当前四项验证只能证明它对静态 size、perf、渲染结果和单测都无差异;若要重新评估它的现实收益,需单独补运行期 heap 量化。由于现有证据还不足以证明它值得保留为当前 public 宏,这个名字已内收到实现内部。
15. EGUI_CONFIG_FONT_STD_LINE_CACHE_ENABLE¶
2026-04-06起,这个名字不再是当前框架 public 配置入口;当前主线已把它内收为实现私有常量,默认行为固定为0。下面保留的是历史 A/B 记录,便于说明为什么它不再值得暴露成公共宏。
属性 |
值 |
|---|---|
默认值 |
当前实现内固定 |
HelloPerformance |
当前随实现内固定 |
RAM 类型 |
heap + BSS |
HP 节省 |
当前默认 |
机制:
多行文本行分割缓存,避免每次 get_str_size 或绘制时重新扫描 \n。结构体中含 lines[MAX_LINES] 指针数组,缓存最近 SLOTS 个字符串的分割结果。当前默认 0 不保留这块运行期 line cache;历史实验值 1 会多占一小块 heap,并换取文本矩形/分行路径的一点吞吐收益。
2026-04-05 按当前主线完成 0 -> 1 全量 A/B 后,结果为:
size:
text 2055380 -> 2055868,data/bss不变即历史
1会带来text +488Bperf:完整
239场景没有任何>=10%回退,也没有任何<=-10%改善主要波动集中在文本矩形路径,仍低于 10% 阈值:
TEXT_ROTATE_NONE +5.714%TEXT_RECT +5.703%EXTERN_TEXT_RECT +3.927%TEXT_RECT_GRADIENT +3.811%其余文本主路径基本持平:
TEXT -0.097%、EXTERN_TEXT +0.0%、TEXT_ROTATE +0.0%、EXTERN_TEXT_ROTATE +0.0%
runtime / unit:
HelloPerformance两侧都是241 frames且hash mismatch 0、pixel mismatch 0;HelloUnitTest两侧都是688/688 passed
因此当前 shipped/default 应记为 0;历史 1 不是 active app-side override,而是一个“多付 text +488B 和约 164B line-cache heap,换文本矩形/换行路径少量收益”的对比值。由于 code-size 收益没有达到保留 public 宏的门槛,这个名字已不再作为当前配置入口。
16 + 17. EGUI_CONFIG_FONT_STD_DRAW_PREFIX_CACHE_MAX_GLYPHS / EGUI_CONFIG_FONT_STD_DRAW_PREFIX_CACHE_SLOTS¶
属性 |
值 |
|---|---|
默认值 |
当前默认 MAX_GLYPHS= |
HelloPerformance |
当前直接继承默认 |
RAM 类型 |
BSS |
HP 节省 |
当前默认 |
机制: Draw-prefix cache 缓存每行文字的字形布局元数据(每个字符的 x 坐标、bitmap box、advance、字形下标等)。当同一字符串在多帧多处重复绘制时,跳过字符串扫描和字形 lookup,直接复用缓存位置信息渲染像素,是常规 UI 场景(label/title 等静态文字)的主要加速手段。
当前主线 shipped/default 已经把这组缓存整体下调到 0 / 0,不再保留 draw-prefix cache。历史实验值 64 / 2 对应的当前主线 A/B 结果为:
size:
text 2055380 -> 2057196,data 72 -> 72,bss 3832 -> 6448即历史
64 / 2会带来text +1816B, bss +2616Bperf:完整
239场景里出现2个>=10%回退、4个<=-10%改善主要回退:
TEXT +18.793%EXTERN_TEXT +15.681%
主要改善:
EXTERN_TEXT_RECT -32.199%TEXT_GRADIENT -14.224%TEXT_RECT -12.357%TEXT_ROTATE_NONE -11.429%
基础图元仍在噪声内:
RECTANGLE / CIRCLE / ROUND_RECTANGLE都是+0.0%runtime / unit:
HelloPerformance两侧都是241 frames且hash mismatch 0、pixel mismatch 0;HelloUnitTest两侧都是688/688 passed
因此当前更准确的定位是:64 / 2 不是 active app-side override,而是一组“多付 text +1816B, bss +2616B,同时重排不同文本路径开销分布”的历史性能对比值;对当前 HelloPerformance 工作负载,它不适合作为默认回开项。
任一为 0 即可禁用,两者联用确保完全关闭:
#define EGUI_CONFIG_FONT_STD_DRAW_PREFIX_CACHE_MAX_GLYPHS 0
#define EGUI_CONFIG_FONT_STD_DRAW_PREFIX_CACHE_SLOTS 0
五、文字旋转变换宏¶
18 + 19. EGUI_CONFIG_TEXT_TRANSFORM_LAYOUT_PIXEL_INDEX_16BIT / LAYOUT_LINE_INDEX_16BIT¶
位置: src/canvas/egui_canvas_transform.c
属性 |
值 |
|---|---|
默认值 |
|
HelloPerformance |
当前默认 |
RAM 类型 |
heap(transient,每帧分配释放) |
HP 节省 |
每颗宏约 |
机制: Text transform 先将所有字形的像素偏移和行索引打包到 heap layout 数组,再按 PFB tile 顺序渲染。这两个宏将数组元素从 32-bit 降为 16-bit,分别限制最大像素偏移(≤ 65535 B)和最大字形索引(≤ 65535)。对短 benchmark 字符串(≤ 255 字形)和 26pt 以下字体完全够用。layout 数组是 transient heap(每帧分配、每帧释放),短字符串下节省约数十 B。
2026-04-04 基于当前 HelloPerformance 主线重新做完整 A/B 后,这组宏的 shipped/default 关系已明确更新为:
当前 shipped 不是历史上的
1 / 1,而是直接继承框架默认0 / 01 / 1只保留在example/HelloPerformance/app_egui_config.h尾部#if 0的可选 low-RAM 块里
其中 EGUI_CONFIG_TEXT_TRANSFORM_LAYOUT_PIXEL_INDEX_16BIT 本轮已经完成定向复测,结论为:
开启后
HelloPerformance text 2055380 -> 2055376,仅回收text -4B,bss不变完整
239perf 场景里没有任何>=10%回退或改善,最大绝对波动约0.75%TEXT_ROTATE_GRADIENT/EXTERN_TEXT_ROTATE与基础RECTANGLE / CIRCLE / ROUND_RECTANGLE / TEXT / IMAGE_565 / EXTERN_IMAGE_565 / IMAGE_RESIZE_565 / EXTERN_IMAGE_RESIZE_565都在噪声内runtime
241帧和HelloUnitTest 688/688仍保持等价
EGUI_CONFIG_TEXT_TRANSFORM_LAYOUT_LINE_INDEX_16BIT 本轮也已完成定向复测,结论为:
开启后
HelloPerformance text 2055380 -> 2055480,反而text +100B,bss不变完整
239perf 场景里同样没有任何>=10%回退或改善,最大绝对波动约1.71%,来自TEXT_ROTATE_QUARTER基础
RECTANGLE / CIRCLE / ROUND_RECTANGLE / TEXT / IMAGE_565 / EXTERN_IMAGE_565 / IMAGE_RESIZE_565 / EXTERN_IMAGE_RESIZE_565仍是+0.0%TEXT_ROTATE -0.041%、TEXT_ROTATE_GRADIENT -0.039%、EXTERN_TEXT_ROTATE +0.0%runtime
241帧和HelloUnitTest 688/688仍保持等价
因此当前更合理的定位是:这两颗宏继续保留为可选 low-RAM transient-heap 实验值,而不是 HelloPerformance 的默认 shipped 配置。
20. EGUI_CONFIG_FUNCTION_FONT_TRANSFORM_FAST_DRAW(prepare/layout 子能力)¶
位置: src/canvas/egui_canvas_transform.c
属性 |
值 |
|---|---|
默认值 |
默认跟随 |
HelloPerformance |
|
RAM 类型 |
BSS |
大小 |
~60 B BSS |
机制:
预计算 text transform 的逆仿射矩阵(sin/cos × scale 混合)及旋转后包围盒,一帧内多个 PFB tile 渲染同一段文字只计算一次,其余 tile 直接复用。该子能力现在直接由 EGUI_CONFIG_FUNCTION_FONT_TRANSFORM_FAST_DRAW 门控;默认值跟随 EGUI_CONFIG_FUNCTION_FONT_STD_FAST_DRAW,且不能在 std-font fast draw 关闭时单独启用。禁用后每 tile 均需重新执行三角函数和矩阵求逆,当前 rotated-text 场景会出现稳定回归,60 B BSS 换取的性价比仍然很高,HelloPerformance 选择保留。
21. EGUI_CONFIG_FUNCTION_FONT_TRANSFORM_FAST_DRAW(dim cache 子能力)¶
位置: src/canvas/egui_canvas_transform.c
属性 |
值 |
|---|---|
默认值 |
默认跟随 |
HelloPerformance |
|
RAM 类型 |
BSS(static 局部变量,本质 BSS) |
大小 |
12 B BSS |
机制:
egui_canvas_draw_string_transform() 内记录上一次调用时的 (font, string) 对及对应的宽高结果(4 个字段,共 12 B 量级)。同一帧内多个 tile 渲染同一字符串时,跳过 get_str_size 遍历。历史上的独立 transform size cache 子开关已删除,该 size cache 现在同样直接挂在 EGUI_CONFIG_FUNCTION_FONT_TRANSFORM_FAST_DRAW 下。12 B BSS,性价比极高,HelloPerformance 保留。
汇总参考表¶
# |
宏名(省略通用前缀) |
默认值 |
HP 设定 |
类型 |
HP 节省估算 |
|---|---|---|---|---|---|
1 |
|
当前实现内固定 4(历史 public 实验 0) |
当前随实现内固定 4 |
BSS |
~33 B(当前关闭仅回收 |
2 |
|
当前默认 2(历史默认 4) |
当前默认 2(历史对比 4) |
heap峰值 |
相比历史 |
3 |
|
当前实现内固定 0(历史 public 实验 1) |
当前随实现内固定 0 |
heap+BSS |
~248 B(当前 |
4 |
|
0 |
当前 shipped 1(历史 low-RAM 2) |
heap峰值 |
|
5 |
|
当前实现内固定 1(历史 public 实验 0) |
当前随实现内固定 1 |
heap |
~128 B(当前关闭只回收 |
6 |
|
当前实现内固定 0(历史 public 实验 1) |
当前随实现内固定 0 |
heap |
~192 B(历史 |
7 |
|
当前实现内固定 0(历史 public 实验 1) |
当前随实现内固定 0 |
heap |
历史 |
~~8~~ |
~~ |
— |
— |
— |
已移除,强制共享+heap |
~~9~~ |
~~ |
— |
— |
— |
已移除 |
8 |
|
当前实现内固定 1(历史 public 实验 0) |
当前随实现内固定 1 |
BSS |
历史 |
9 |
|
当前实现内固定 1(历史 public 实验 0) |
当前随实现内固定 1 |
BSS |
历史 |
10 |
|
1024 |
当前默认 1024(历史实验 64) |
BSS/frame heap |
~960 B(当前 |
11 |
|
1 |
当前默认 1(历史实验 0) |
BSS -> frame heap |
~1040 B(当前 |
12 |
|
当前实现内固定 0(历史 public 实验 1) |
当前随实现内固定 0 |
data |
历史 |
13 |
|
当前默认 1(含历史 ASCII cache 能力) |
当前默认 1 |
heap+BSS |
当前已合并为 |
14 |
|
当前实现内固定 0(历史 public 实验 1) |
当前随实现内固定 0 |
heap |
历史 |
15 |
|
当前实现内固定 0(历史 public 实验 1) |
当前随实现内固定 0 |
heap |
当前 |
16 |
|
当前默认 0(历史实验 64) |
当前默认 0(与宏17联动) |
BSS |
当前 |
17 |
|
当前默认 0(历史实验 2) |
当前默认 0(与宏16联动) |
BSS |
必须与宏16一起回开到 |
18 |
|
0 |
当前默认 0(历史实验 1) |
heap transient |
~2N B(当前 |
19 |
|
0 |
当前默认 0(历史实验 1) |
heap transient |
~2N B(当前 |
20 |
|
默认跟随 |
1(保留) |
BSS |
0(已开) |
21 |
|
默认跟随 |
1(保留) |
BSS |
0(已开) |
† 宏 14 需搭配
EGUI_CONFIG_FUNCTION_FONT_STD_FAST_DRAW=1才有实际作用;它当前已内化,列入仅为历史参考。
使用建议¶
激进低 RAM 场景(类 HelloPerformance)¶
建议优先启用那些已经验证为功能等价或可接受条件实验的项;其中宏1(alpha opaque cache)当前不再默认推荐关闭,因为 4 -> 0 虽能回收 text -156B, bss -40B,但会带来 8 帧 runtime 像素差。其余如 compress index(宏5/6)、禁用持久元数据全局 slot(宏8/9=0;宏11已内收,仅保留历史 A/B)、缩小 RLE window(宏10=64)、禁用 prefix 缓存(宏16/17=0)、把 EGUI_CONFIG_FUNCTION_FONT_STD_FAST_DRAW 从 1 降到 0、以及禁用 line cache(宏15=0)仍需结合对应小节单独评估。外部行缓存共享现已强制启用,heap 分配按需进行。
注意事项¶
宏 3(OPAQUE_ALPHA_ROW_USE_ROW_CACHE)的历史行为依赖
EGUI_CONFIG_FUNCTION_IMAGE_CODEC_FAST_DRAW>=1;该入口现已内收到实现内部。宏 20/21(同一颗
EGUI_CONFIG_FUNCTION_FONT_TRANSFORM_FAST_DRAW的 prepare/layout 与 dim 子能力)现在统一由该宏直接门控;它默认跟随 std-font fast draw,且不能绕过 std-font fast draw 单独启用。在 std-font fast draw 打开的前提下,它仍是文字旋转性能的关键,禁用会导致每 tile 重计算仿射/宽高,不建议关闭。