我的树莓派 4B 上插着一块微雪 3.5 寸 TFT 屏(480×320,/dev/fb1 帧缓冲)。最初用 Python 写了个系统仪表盘显示 CPU、温度、内存、磁盘、IP、Docker 容器和 Tailscale 状态,但很快摸到性能天花板,最后用 Rust 重写了整个东西(pi-dashboard,v0.2.2)。
为什么 Python 不够
这种小屏的性能瓶颈不在 CPU,而在 SPI 总线。整块屏 480×320×2 字节 = 300KB,每次全屏刷新都是一笔不小的 SPI 传输。Python 版本静态画面还好,一旦内容有变化就明显掉帧。
Rust 版做的几件事
脏区刷新。核心思路是只把画面里变化的矩形区域写入帧缓冲。静止状态下 SPI 写入量远小于全屏,动态画面下的流畅度立刻不一样了。为此自己实现了 RGB565 帧缓冲层和一套几何原语。
字体渲染。写了一个字体级 baseline 锚定的文本引擎——小屏上文本对不齐非常扎眼,baseline 锚定让多行混排稳定得多。
SPI 超频到 48MHz。微雪屏官方建议频率偏保守,树莓派和这块屏的配合在 48MHz 下稳定,主循环跑到 15 FPS。
裸解析触摸事件。不依赖任何触摸框架,直接读 input_event,够轻也够可控。支持点击容器列表翻页。
双通道指标采集。CPU 这类变得快的指标走快通道,磁盘、IP 这类变得慢的走慢通道,各刷各的,互不拖累。
最有意思的部分:让聊天机器人也能看屏
仪表盘内置了一个 Unix Domain Socket 的 IPC server,配套写了 pi-dashboard-mcp——一个 MCP server,让 AstrBot(我部署的聊天机器人)可以直接查询系统状态、截屏、切换显示模式。
也就是说,机器人不用问人「服务器现在什么状态」,它自己看一眼屏幕就知道了。
尾巴
这个仪表盘是树莓派时代的遗物——2026 年 9 月底我把整套服务迁到了一台小新笔记本上,树莓派正式退役。项目代码和这段折腾的记录都留在 GitHub 和本站里,权当纪念。
树莓派退役之后这块屏还留着。有些硬件退役了,但它教会你的东西会一直跟着你。