墨趣Vivid-01-水墨写意给嵌入式GUI的3个反直觉启发

41 阅读5分钟

画家落笔讲究水韵晕染,工程师渲染追求帧帧确定。

艺术允许留白,工程必须算清。

本文不谈玄学,只用三个中国写意画的底层逻辑,拆解嵌入式 GUI 从数据到屏幕的确定性管线。

 ▎ 引子:一瞬千年

老画师悬腕落笔,十分钟后山水跃然纸上。画成,不改。

与此同时,你的工业屏每秒刷新 30 次。每一次刷新,都是一次“数字水墨”:CPU 是画家,光栅化是笔法,Frame Buffer 是宣纸。

画师可以随心晕染,但渲染管线不能。

当上层要求“这帧必须准时、准确、不撕裂地落到屏幕上”,底层该如何设计,才能让每一次渲染都像老画师落笔——不改、不重、不猜?

 ▎ 一、留白不是空:Alpha 通道与像素精度

中国画论讲“计白当黑”。画面里的空白不是没画,是精心规划的空间。

在嵌入式 GUI 里,留白有一个冰冷的名字:Alpha 通道。

A=0 不是“不画”,是精确写入 0

宣纸的白靠不落笔,屏幕的白靠 Alpha=0 的逐像素写入。混合公式不是艺术感觉,而是每个像素每帧必算的整数运算:

Out = Src × α/255 + Dst × (1 - α/255)

1920×1080 的画面,一帧就是 200 万次乘加。少一次,画面就错。

工业屏为何偏爱 RGBA8888?

  • RGB565 每像素 2 字节,省内存,但无 Alpha 通道,工业报警色环的对比度(ISA-101/WCAG ≥4.5:1)无法达标

  • RGBA8888 每像素 4 字节,内存翻倍,但报警红/橙色边缘清晰可辨。合规的代价,比内存更贵。

  • 忽略 Stride 的硬件对齐填充(如 128 字节),整屏像素直接错位。一行错,行行错。

熟宣不洇:预乘 Alpha 防黑边

非预乘 Alpha(RGB 与 A 分开存)混合时需额外乘一次,易在边缘产生“黑边晕染”。

工业 UI 要求像素锐利,必须用预乘 Alpha(RGB 存储时已乘 A):

Out = Src + Dst × (1-α)

少一步乘法,少一个误差源,报警框边缘干净利落。

// 满纸留白:按硬件 Stride 清零,覆盖对齐填充区

memset(canvas, 0, height * stride);

for (int r = y; r < y + h; r++)

  for (int c = x; c < x + w; c++) {

      int p = r * stride + c * 4;

      canvas[p] = 255; canvas[p+3] = 180; // R / A

  }

// 框外的“空白”,每个字节都是精确计算过的 0。

 ▎ 二、墨分五色:图层叠加与 Dirty Rect

墨只有一种颜色,五色全在水的多少。GUI 的层次感,全在 Alpha 与 Z 序的精确配比。

四层结构,自上而下

  • 顶层 OSD(报警图标/时间戳):Alpha 0.9+,必须锐利

  • 浮层检测框:Alpha 0.7-0.9

  • 中间热力图/轨迹:Alpha 0.3-0.5

  • 底层视频帧:Alpha 1.0,完全不透明

4 层 1080p 全屏 RGBA 叠加,纯软每帧数据搬运约 33MB。若锁 60Hz,带宽直冲 2GB/s,低端 MPU 必卡。

工程解法:脏矩形 + 钤印

- Dirty Rect:只重绘“改了的那一笔”。工业场景多数帧仅 OSD 变化,重绘 10% 区域即可,CPU 占用直降 70%+

- Block Transfer(钤印):图标/Logo 预渲染至独立小 Buffer,每帧整块 memcpy 拷贝至目标坐标。不逐像素重绘,快一个数量级

组件的边界:不替你抢显示总线,不黑盒管理层级。只交付一块 Alpha 精确、Stride 对齐的 RGBA Buffer。边界守得住,管线才稳定。

 ▎ 三、写意不改笔:双缓冲与 30Hz 的确定性

写意最忌“描”。墨已入纸,改即脏。必须意在笔先,一气呵成。

GUI 最忌“撕裂”。直接写屏时若恰逢屏幕刷新,会出现半帧旧+半帧新,工业现场绝不可接受。

双缓冲:两张宣纸,一张挂墙,一张在画

  • Front Buffer:屏幕正在显示

  • Back Buffer:后台渲染下一帧

渲染完成后,在垂直消隐期(VSync)原子交换(Page Flip)。用户永远只看到完整帧。

代价:内存翻倍(1080p ×2 ≈ 16.6MB)。但比操作员看到半截报警框按错按钮的代价,便宜太多。

为何工业屏锁定 ≤30Hz?

  • 30Hz 在荧光灯等环境下易引发频闪干扰

  • 报警状态变化人眼 50ms 内即可感知,33.3ms/帧完全覆盖

  • 锁 30Hz 省出的 CPU 与带宽,可多跑一路 AI 检测通道

30Hz 不是“慢”,是“确定性”。

 ▎ 四、工程验证:数据不说谎

(Cortex-A7 1GHz / 256MB RAM / Linux 5.10 DRM-KMS / NEON 优化)

▎ 基准数据

  • 4 层全屏 Alpha 混合:CPU 3.8% | 带宽 ~130MB/s | 稳 30FPS

  • 仅 OSD 更新(Dirty Rect ~10%):CPU <1% | 带宽 ~15MB/s

  • 单缓冲直写屏:CPU 1.2% | 可见撕裂

▎ 三个工程结论

1. 混合是绝对性能大户。RGBA8888 的内存代价,低于工业对比度合规失败的风险。

2. Dirty Rect 是低端 MPU 的续航核心。省下的 3% CPU,可直接转化为检测通道算力。

3. 30Hz 是工业确定性最优解。60Hz 动效无感知增益,只有闪烁风险与带宽浪费。

写意留白,是艺术的呼吸;管线确定,是工程的底线。

用像素作画,以边界为框。

🔜 下期预告:02 / 05《宣纸的质地——Framebuffer、像素格式与内存带宽的工程权衡》