在 RP2350 上用 JIT 渲染位图字体
JIT bitmap text rendering for microcontrollers

我正在开发 vic-2350 项目,试图在 RP2350 微控制器上重现 80 年代家用计算机的体验。为了兼顾效率与复古美学,我选择了位图字体而非抗锯齿渲染,并实现了比例间距与字距调整。面对微控制器严苛的性能限制,Rust 无法满足每像素 6 个周期的预算,因此我使用自研的 symbolasm 语言编写 ARM 汇编,并引入 JIT 技术在运行时动态生成高度优化的渲染代码。通过紧密打包字体数据、利用符号重叠以及精细的指令调度,我成功实现了极速的位图文本渲染,让复古美学在现代硬件上重获新生。
在低分辨率下,我更喜欢清晰、精心设计的位图字体美学,而不是抗锯齿渲染产生的模糊一团。
HN 评论区
22- sehugg
挺巧的,我前几天刚好也在想 JIT 渲染的 blitter。我很确定 Windows 3.1 的 BitBlt 函数就是个 JIT,大概是从模板里构建 blitter 例程,因为他们得处理不同的源/目标操作、不同的每像素位数,还有线性/平面帧缓冲区。
Symbolasm 看起来挺酷。
- drzaiusx11
“追逐电子束”(racing the beam)这种技巧在过去延长了许多内存捉襟见肘的系统的寿命,比如 Atari VCS/2600(它只运行着一颗 6507 处理器和 128 字节的 RAM!)。在那些基本上没有内存、只靠一点点软件来控制电子束的机器上,你能做到什么程度真是令人惊叹。
- drfuchs
关于相关的先前工作,可以看看 1996 年提交的专利 US-6377261-B1,标题是“将字形编译为通用计算机成像指令以供执行”。基本思路是每个字符都转化为一串“立即数加载”/“移位”/“或运算到内存”指令;因此不再需要从存储的字体位图中获取数据,因为像素已经隐含在生成的机器代码的立即数数据里了。然后当字符的某一行像素与上一行相同时,你可以玩得更花哨,甚至不需要做“立即数加载”。等等。这套方案当年被用在 Macintosh 版的 FrameMaker 中,由 Gus Fernandez 实现(他在额外优化上可是玩疯了)。