SafeB9SInstaller UI系统指南:双屏帧缓冲渲染与多字体支持如何实现? 📅 2026/8/26 14:55:54 SafeB9SInstaller UI系统指南双屏帧缓冲渲染与多字体支持如何实现【免费下载链接】SafeB9SInstallerSafe, simple, user-friendly installer for sighaxed FIRMs项目地址: https://gitcode.com/gh_mirrors/sa/SafeB9SInstallerSafeB9SInstaller是一款安全、简单、用户友好的 3DS sighaxed FIRM 安装器其核心 UI 系统在无任何图形库的支持下仅靠 C 语言就完成了双屏帧缓冲渲染与多字体支持。本文将带你快速读懂它的实现思路 。一、双屏帧缓冲上下两块画布从哪来Nintendo 3DS 拥有上屏400×240与下屏320×240两块屏幕。程序启动时main函数会先拿到两块屏幕的帧缓冲地址保存在全局指针top_screen和bottom_screen中见 source/main.c 第14~29行新入口从argv[1]解出的指针数组中取fb[0]上屏与fb[2]下屏旧入口直接读取固定内存地址0x23FFFE00/0x23FFFE08中存放的地址。两块屏幕的几何参数集中在 source/common/ui.h 中定义参数值含义BYTES_PER_PIXEL3每像素 3 字节B、G、R 各 1 字节SCREEN_WIDTH_TOP400上屏宽度SCREEN_WIDTH_BOT320下屏宽度SCREEN_HEIGHT240两屏统一高度TOP_SCREEN/BOT_SCREEN两个宏只是top_screen/bottom_screen的别名所有绘制函数都接收画到哪块屏作为第一个参数因此渲染逻辑对双屏完全通用。二、像素级渲染没有图形库也能画界面整个渲染层位于source/common/ui.c只有 5 个原子绘图函数ClearScreen(screen, color)— 按 BGR 逐字节填充整块帧缓冲清屏DrawRectangle(screen, x, y, w, h, color)— 逐行写入矩形色块DrawCharacter(screen, ch, x, y, ...)— 按位测试字体点阵并画一个字符DrawString(screen, str, x, y, ...)— 循环调用DrawCharacter自动按屏幕宽度截断DrawStringF(...)— 支持printf风格格式化并自动按换行符折行。几个值得学习的设计细节 ⚙️透明色技巧COLOR_TRANSPARENT被定义为超级品红0xFF00EF绘图时遇到该值表示不覆盖背景避免引入 alpha 通道颜色即宏RGB(r,g,b)宏配合COLOR_WHITE、COLOR_GREEN、COLOR_DARKRED等 20 余种预定义色统一了上/下屏的视觉风格坐标自动居中GetDrawStringWidth/Height先算出文本实际占位再对齐屏幕中心提示框无需手动算坐标。下屏则专门用于状态面板source/installer.c 中用DrawStringF(BOT_SCREEN, ...)逐行刷新 ARM9LoaderHax、MicroSD 卡、FIRM、密钥状态、安装进度等 7 条状态行与上屏的交互界面分工明确。三、多字体支持编译期切换的零成本方案字体数据以raw2c工具生成的 C 数组形式存放于source/font/目录每个字符按每行 1 字节、位表示像素的点阵编码字体规格源文件适用场景Linux 6x10默认6×10source/font/font_6x10.h信息密度高适合英文长句原始 Decrypt9 字体8×8source/font/font_orig.h经典风格Linux Acorn8×8source/font/font_acorn_8x8.h复古终端感GB 像素字体7×6source/font/font_gb_7x6.h小巧紧凑切换机制非常简洁source/font/font.h 依据编译宏FONT_6X10/FONT_ACORN/FONT_GB四选一而 Makefile 第38~48行用一行FONT参数控制make FONTORIG # 原始 8x8 字体 make FONT6X10 # Linux 6x10 字体默认 make FONTACORN # Acorn 8x8 字体 make FONTGB # GB 7x6 字体字体切换只影响编译期常量FONT_WIDTH/FONT_HEIGHT和点阵数组本身渲染代码零改动——这也是嵌入式 UI 中数据与代码分离的经典做法。四、交互组件提示、选择与进度条在原子绘图函数之上ui.c 封装了一组开箱即用的交互组件覆盖了安装器所需的全部界面形态ShowPrompt— 是/否确认框等待 A/B 键ShowSelectPrompt— 方向键高亮式菜单选中项白色、未选项浅灰ShowInputPrompt— 字符编辑输入框支持上下换字符、左右移光标、L 键快滚、Y/X 增删用于输入密钥十六进制ShowUnlockSequence— 按键序列解锁动画7 级难度配 7 种颜色逐级变辣️ShowProgress— 进度条 百分比 ETA 剩余时间估算用滑动平均平滑剩余秒数按住 B 可取消字符串工具—ResizeString/TruncateString/FormatBytes等保证任何文本都能优雅地装进固定栏宽。这些组件全部只依赖清屏 → 重绘 → 轮询按键三件事没有窗口系统、没有事件队列却实现了完整、稳定的安装向导体验。五、小结小内存里的大工程SafeB9SInstaller 的 UI 系统展示了嵌入式裸机编程的务实之美双屏帧缓冲直接映射到指针绘制函数与屏幕解耦5 个原子绘图函数撑起全部 2D 渲染无图形库依赖多字体编译期切换一份渲染代码适配 4 套点阵组件化交互层让安装器逻辑专注业务流程而非界面细节。如果你想继续阅读源码建议从source/common/ui.h的接口定义入手再对照source/installer.c中各状态页的调用方式即可完整还原整个界面的绘制流程。【免费下载链接】SafeB9SInstallerSafe, simple, user-friendly installer for sighaxed FIRMs项目地址: https://gitcode.com/gh_mirrors/sa/SafeB9SInstaller创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考