为 N64 找到合适的音频编码:4% 的 CPU 跑 44.1kHz 立体声
来源:phoboslab.org — 2026-11-03
📋 概述
N64 的音频处境很差:卡带空间宝贵,93MHz 的 CPU 紧张,向量协处理器 RSP 长期不对第三方开放。Libultra 的 ADPCM 能把样本压到四分之一,但五分钟立体声仍要 12MB;Libdragon 里已有 RSP 加速的 Opus 解码器,质量好却太慢,不能用于游戏过程。作者找到 Aikku93 为 GBA 写的 ULC:全带 MDCT 变换加纯 nibble 打包、没有熵编码,解一个块约 150 行 C。他把解码器改成 Q1.14 定点,用 RSPL 把 IMDCT 移植到 RSP(约 1400 行 MIPS 汇编,硬塞进 4KB 指令内存),最终 44.1kHz 立体声只占约 4% CPU、5% RSP,质量与码率接近 Opus。
🔑 核心要点
- N64 的历史约束:卡带空间稀缺、93MHz CPU 紧张、RSP 长期只给第一方用,录音式音频几乎不可能。
- ADPCM 把样本压到四分之一仍然太贵:作者的游戏用掉 32MB 卡带里的 31MB 装音乐,而超级马里奥 64 整个 ROM 才 8MB。
- ULC 是「去掉历史包袱的 MP3」:全带 MDCT 加 nibble 语法,没有霍夫曼编码,解包一个块约 150 行 C。
- nibble 语法里保留了几个特殊值:零游程、长零游程、量化器切换、噪声填充,全部字节对齐。
- 16 位定点(Q1.14)已经够用,作者反复调大音量只听到极淡的白噪声。
- 约 1400 行 MIPS 汇编塞进 4KB 指令内存,44.1kHz 立体声约占 4% CPU、5% RSP,已合入 Libdragon 预览分支。
💡 金句
一句话概括:ULC 就是 MP3 本来可以成为的样子——同样的核心想法,只是去掉了周围的赘物。
👍 0
👎 0
← 返回 Lobsters 首页