标签:音频系统
-
混音线程:AudioServer 的锁竞争实测 —— 音频线程和游戏线程的边界
音频线程每 10.7ms 必须完成一次混音,游戏线程的任何鲁莽 API 调用都可能去抢同一把锁。这篇拆 AudioServer 的线程模型、哪些调用真会进临界区、以及一个放大锁竞争的实测方法。
-
AudioStreamPlayer 的播放调度与 pitch:变调不变速的实现
play() 之后声音不是立刻出来,而是要等设备缓冲轮转;pitch_scale 改的不是音频数据而是重采样相位步长。这篇讲播放调度的内部状态机、seek 与 start offset 的差异、以及为什么 pitch 变化音高和时长一起变。
-
音乐节奏游戏的延迟校准:输出延迟从哪来、怎么测
节奏游戏对音频延迟的容忍度在毫秒级,而 Godot 的默认配置端到端延迟可能有 50ms 以上。这篇拆延迟的四个组成部分、讲怎么用手机慢动作录像实测延迟、以及 Input 时间戳和 audio clock 对拍的实现方法。
-
OGG/MP3/WAV 后端差异:解码进内存还是流式
三种音频格式在 Godot 里走完全不同的解码后端和内存路径:WAV 原样进内存,OGG 用 stb_vorbis 流式解码,MP3 的循环缝隙是先天缺陷。这篇给解码路径、内存账和循环点坑的对照。
-
录音与麦克风输入:AudioEffectCapture 的回采
想做语音、音游收声或实时特效,就得把麦克风的音频流接回游戏逻辑。这篇讲 AudioEffectCapture 挂总线的回采模型、环形缓冲容量公式、跨线程读数据的正确姿势和丢帧诊断。
-
交互式音乐:分层音轨的切换实现 —— 用同步播放做无缝过渡
战斗激烈度上来时音乐怎么"加乐器"而不跳拍?这篇讲 vertical layering 的同步播放原理、等功率交叉淡入的数学,以及 4.3 引入的 AudioStreamInteractive 是怎么把这件事收进引擎的。
-
音频资源热加载的坑 —— 播放中替换 stream 会发生什么
运行时换 AudioStreamPlayer 的 stream 看似简单,实际会把 playback 状态整个炸掉。这篇讲服务器侧 playback 句柄的解绑语义、三种无缝换流方案和运行时 load_from_buffer 的动态音频路线。
-
3D 空间音频:距离衰减与多普勒,AudioStreamPlayer3D 的衰减模型
AudioStreamPlayer3D 在 mix 前把单声道源按听者位置算衰减、声像和多普勒音高偏移,再交给普通立体声混音。这篇讲距离衰减三种模式的数学形式、双声道声像的正弦平移法、以及多普勒为什么只调 playback 的 pitch 不动数据。
-
音频总线效果器:自带 DSP 一览,混响和压缩器的参数含义
Godot 自带二十多种音频效果器,混音器(八-1)在每路 bus 上就靠它们整形声音。这篇按用途分组梳理常用效果器、讲清混响的预延迟/衰减/扩散三个核心参数背后的物理意义、以及压缩器阈值与比率怎么调。
-
AudioStreamGenerator 实时合成:在 GDScript 里手搓波形
AudioStreamGenerator 把混音器变成一个你往里推采样帧的接口,这篇讲 push 模型背后的环形缓冲、相位累加器合成正弦的原理、以及缓冲深度和延迟的权衡公式。
-
AudioStream 的解码与环形缓冲:流式播放为什么不会卡顿
一首 3 分钟的 OGG 只有 4MB 文件却要在播放的每一帧都按时交出采样,解码器和消费端的速度 mismatch 用环形缓冲抹平。这篇讲 AudioStreamPlayback 的 mix 契约、流式 buffer 的补齐时机(低于 1/3 阈值回填)、以及随机访问流和顺序流的实现差异。
-
AudioServer 的软件混音器:bus 树的实时混音
Godot 不用系统混音器,自己在音频线程里做软件混音:所有 AudioStreamPlayer 把采样累加进各自 bus 的浮点缓冲,再沿 bus 树逐层流向 Master。这篇讲 mix 步骤的遍历顺序、效果器实例的挂接方式、音频线程与主线程的锁边界。