Fast Path Config

本页是当前 fast-path 相关配置的唯一用户入口。

它只回答三件事:

  • 现在还有哪些 fast-path 相关配置值得用户关注

  • 每个配置大致在换什么 ROM / SRAM / perf

  • 哪些历史宏已经不再是推荐用户配置

如果某个 fast-path 名字不在本页里,默认就不要把它当成当前支持的用户配置项。

1. 先看结论

当前真正建议用户关注的,主要只有 5 个共享配置宏:

  • EGUI_CONFIG_IMAGE_DECODE_MAX_PIXEL_SIZE

  • EGUI_CONFIG_FUNCTION_IMAGE_CODEC_FAST_DRAW

  • EGUI_CONFIG_IMAGE_CODEC_PERSISTENT_CACHE_MAX_BYTES

  • EGUI_CONFIG_IMAGE_EXTERNAL_PERSISTENT_CACHE_MAX_BYTES

  • EGUI_CONFIG_IMAGE_RLE_EXTERNAL_CACHE_WINDOW_SIZE

这 5 个配置还保留着,是因为它们现在仍然在表达明确的产品取舍:

  • decode heap 上界

  • 压缩图片主路径策略

  • cache / SRAM 预算

而一批只省几十到几百字节的微型 fast-path 宏,已经不再作为用户配置项提供。

2. 当前支持的共享配置

下表可以直接当成用户选型入口看。

当前默认

主要作用

典型代价 / 收益

什么时候考虑调整

EGUI_CONFIG_IMAGE_DECODE_MAX_PIXEL_SIZE

2

限制 decode 阶段的单像素 scratch 上界

2 -> 4text +108B,完整 239 场景无明显性能波动

只有当资源格式或解码路径确实需要更高像素 scratch 时再调大;一般保持默认

EGUI_CONFIG_FUNCTION_IMAGE_CODEC_FAST_DRAW

0

控制压缩图片 fast draw 的 3 档模式:0=关闭1=full row-band2=tail-row low-RAM

0 -> 1 会额外引入约 text +5108B,但能避免 internal tiled QOI/RLE 热点 +111% ~ +634% 回退;1 -> 2 会再引入约 text +9976B,换来约 2304B 峰值 heap 收益

项目有压缩图片热点时,先做 0/1 A/B;如果还要继续压峰值 heap,再评估 1/2

EGUI_CONFIG_IMAGE_CODEC_PERSISTENT_CACHE_MAX_BYTES

0

给 codec 整图 persistent cache 预留预算

0 -> 5000text +2948B, bss +24B;历史上只有 IMAGE_TILED_QOI_565_0 有明显改善 -13.1%

只在你已经确认 codec 热点集中在少量重复资源,且愿意为此付出额外 ROM/BSS 时再调大

EGUI_CONFIG_IMAGE_EXTERNAL_PERSISTENT_CACHE_MAX_BYTES

0

给 external image persistent cache 预留预算

0 -> 5000text +948B, bss +40B;部分 external tiled/resize 场景改善 -32.6% ~ -61.6%

项目大量使用 external image,且更关心这些场景的吞吐时可考虑调大

EGUI_CONFIG_IMAGE_RLE_EXTERNAL_CACHE_WINDOW_SIZE

1024

控制 external RLE 的窗口大小,也就是一块直接的 SRAM 预算

1024 -> 64text +96B, bss -1024B,但 external RLE 主路径回退 +17.5% ~ +21.8%

只在 SRAM 非常紧张,且可以接受 external RLE 明显变慢时再缩小

这 5 个配置怎么理解

  • MAX_PIXEL_SIZE 主要是 heap 上界问题,不是典型 fast-path 开关。

  • EGUI_CONFIG_FUNCTION_IMAGE_CODEC_FAST_DRAW 同时收口了“是否启用 row cache”和“是否切到 tail-row low-RAM 路径”两个决策,应该按 0 / 1 / 2 三档做真实场景 A/B。

  • 两个 *_PERSISTENT_CACHE_MAX_BYTES 更像“预算项”,不是“应该默认打开的优化项”。

  • RLE_EXTERNAL_CACHE_WINDOW_SIZE 是最直接的 SRAM 换性能入口。

3. 示例里还能看到的局部开关

当前仓内仍保留两个示例局部开关,但它们不是框架统一配置面:

名字

用途

对用户的建议

EGUI_CONFIG_FUNCTION_FONT_STD_FAST_DRAW

示例或模板里用来做文字路径 A/B;0=关闭1=打开完整 std-font fast draw(含 ASCII 直查表)

普通项目不要额外发散使用;历史上关闭 fast draw 虽可省约 8328B 代码,但文本热点会回退 +27% ~ +465%

EGUI_CONFIG_CIRCLE_FILL_BASIC

HelloPerformance 的 benchmark 局部入口

只在 benchmark 或定向实验里使用;普通产品配置不用关注

EGUI_CONFIG_FUNCTION_FONT_STD_FAST_DRAW 也是字体 fast/cache 路径的总开关;内部的 code lookup cache、transform prepare/layout cache、transform size cache 和 draw-prefix cache 都不能绕过它单独生效。历史上的 code lookup / transform size 独立宏已经删除,其中 transform size cache 进一步受 EGUI_CONFIG_FUNCTION_FONT_TRANSFORM_FAST_DRAW 约束。

图像 RGB565 alpha opaque cache 也不再保留独立配置入口,随 EGUI_CONFIG_FUNCTION_IMAGE_FORMAT_RGB565 直接编译;image/canvas/font 的 frame-cache release 钩子固定在帧结束执行,不再暴露单独的 release 宏。

如果你是在复制 tiny_rom / basic_ui 这类模板配置,看到 APP_EGUI_* 名字是正常的;但它们只代表模板或示例的局部选择,不代表框架统一推荐接口。

4. 哪些历史宏已经不建议用户再调

下面这些类型的名字,当前都不建议再作为用户配置入口依赖:

  • QOI / RLE 解码内部的小 checkpoint、小索引、小 cache 宏

  • 字体内部的小型 lookup / line cache 宏

  • 只换回几十字节到一两百字节 SRAM 的 external row persistent 宏

  • 只换回几十字节 ROM / BSS 的 source-opaque / row-cache 细节宏

原因也很直接:

  • 它们大多只能换回几十到几百字节

  • 继续公开出来会让配置面越来越碎

  • 其中一些甚至会用很小的 size 收益换来非常大的性能退化

几个典型例子:

  • QOI checkpoint count

    • 只省约 text -276B, bss -8B

    • 但历史 20 个 QOI 场景会回退 +110% ~ +911%

  • RLE checkpoint

    • 只省约 text -92B, bss -16B

    • 但历史 20 个 RLE 场景会回退,峰值约 +452%

  • font 的小 lookup / line cache 宏

    • 典型收益只有 text +200B / +488B 量级

    • 不值得继续暴露给用户做长期调参

  • std / transform external row persistent cache

    • 典型也只有 bss -40B / -56B

    • 这类收益太小,不值得保留成用户可配项

判断规则可以简单记成一句话:

  • 不能明显改变产品预算的微型宏,不值得继续开放给用户。

5. 按目标选择

5.1 如果你优先压 ROM

优先做这几件事:

  • 保持 EGUI_CONFIG_FUNCTION_IMAGE_CODEC_FAST_DRAW=0

  • 保持两个 *_PERSISTENT_CACHE_MAX_BYTES=0

  • 只有在压缩图片热点确实存在时,才评估 EGUI_CONFIG_FUNCTION_IMAGE_CODEC_FAST_DRAW

不要做的事:

  • 不要再去追那些已经移除的历史微宏

  • 不要为了省几百字节,把 QOI/RLE 主路径打穿

5.2 如果你优先压 SRAM

优先看:

  • EGUI_CONFIG_IMAGE_RLE_EXTERNAL_CACHE_WINDOW_SIZE

  • EGUI_CONFIG_IMAGE_DECODE_MAX_PIXEL_SIZE

推荐顺序:

  1. 先确认 MAX_PIXEL_SIZE=2 是否已经满足需求

  2. 再评估 RLE_EXTERNAL_CACHE_WINDOW_SIZE 是否能从 1024 缩小

  3. 如果缩小,就必须做 external RLE 场景回归

5.3 如果你优先要压缩图片性能

优先看:

  • EGUI_CONFIG_FUNCTION_IMAGE_CODEC_FAST_DRAW

  • EGUI_CONFIG_IMAGE_CODEC_PERSISTENT_CACHE_MAX_BYTES

适用场景:

  • 项目里有明显的 QOI/RLE 压缩图片热点

  • 尤其是 internal tiled scene

  • 先确认 EGUI_CONFIG_FUNCTION_IMAGE_CODEC_FAST_DRAW=1 是否已经足够;只有在还要继续压峰值 heap 时,再评估 =2

5.4 如果你优先要 external image 性能

优先看:

  • EGUI_CONFIG_IMAGE_EXTERNAL_PERSISTENT_CACHE_MAX_BYTES

适用场景:

  • external image 读取频繁

  • 同一批资源会被重复访问

  • 你可以接受额外的 ROM / BSS

6. 用户文档的一条边界

本页只覆盖“当前仍值得用户调”的入口。

如果你在其它 retention 文档里看到更多 fast-path 名字,需要这样理解:

  • 这些名字大多只是历史 A/B 记录

  • 它们不是当前推荐用户配置面

  • 对普通项目来说,不要因为历史文档里出现过,就把它们重新加回产品配置

只有在你明确要做框架维护或重新做一轮完整 A/B 时,才需要继续阅读:

  • example/HelloPerformance/fast_path_retention.md

  • example/HelloPerformance/macro_decision_matrix.md

  • example/HelloPerformance/macro_cleanup_summary.md

7. 一句话总结

当前 fast-path 配置的用户口径很简单:

  • 真正值得用户调的,只剩少数几个能明显改变 ROM / SRAM / perf 预算的配置项。

  • 其余微型 fast-path 宏,默认都不要再碰。