← Модуль 8/Аудио и DSP
EN
Модуль 8 · Технический deep-dive

Аудио и DSP

Звук — невидимая половина game feel и при этом жёсткий real-time DSP: аппаратура каждые несколько миллисекунд просит следующий буфер сэмплов, и аудио-поток обязан его успеть заполнить — иначе щелчок. Дедлайн жёстче кадрового и куда менее прощающий.
~16 мин🔬 DSP + 🎲 дизайн
Суть за 30 секунд
Игровой звук — это real-time DSP. Звук = поток сэмплов (48 кГц = 48 000 значений амплитуды в секунду; Найквист: частота дискретизации ≥ 2× максимальной слышимой ~20 кГц). Железо потребляет сэмплы непрерывно и колбэком просит следующий буфер; аудио-поток обязан заполнить его до дедлайна, иначе — щелчок/дропаут (буфер 256 сэмплов @ 48 кГц = 5.3 мс дедлайн). Движок строит DSP-граф: источники → эффекты (reverb/EQ/фильтры) → спатиализация (HRTF для 3D-позиции в наушниках) → микс (сумма + не заклиппить) → выход. Динамику дают адаптивная музыка (Hades: слои стемов, кроссфейд по состоянию боя) и процедурное аудио (синтез шагов → бесконечная вариация, мало памяти). Всё это пакует мидлварь (FMOD/Wwise) как event-driven и параметрический — саунд-дизайнер работает без кода движка. Форма — потоковый сигнальный пайплайн с жёстким дедлайном — та же, что у любого real-time DSP/инференса.

Механизм: сигнал под жёстким дедлайном

Звук как сэмплы

Аудио — амплитуда во времени, дискретизированная 44.1/48 кГц: каждый сэмпл — одно значение амплитуды. Секунда стерео @ 48 кГц — 96 000 чисел. Потолок частоты задаёт теорема Найквиста:

fmax= R2=24 кГц (при R=48 кГц)

Больше 20 кГц человек не слышит, поэтому 44.1/48 кГц хватает; всё DSP работает над этим потоком чисел.

Колбэк и дедлайн буфера

Аудио-железо тянет сэмплы непрерывно и периодически зовёт колбэк: «дай следующие N сэмплов». Аудио-поток обязан их произвести до того, как буфер опустеет, иначе динамик проиграет мусор/тишину → щелчок/дропаут. Это жёсткий real-time, причём тайминг тоньше кадрового:

latency= NR= 25648000≈5.3 мс

Размер буфера — размен латентность против безопасности: маленький (256 сэмплов = 5.3 мс) даёт низкую задержку, но узкий дедлайн; большой безопаснее, но звук «отстаёт». И промах слышен мгновенно: пропущенный кадр глаз почти не замечает, а пропущенный аудио-буфер — резкий щелчок. Поэтому аудио живёт на отдельном высокоприоритетном потоке с фиксированным крошечным дедлайном — оно не может делить плавающий тайминг главного потока.

DSP-граф

Звук — это сигнальный граф, обрабатываемый буфер-за-буфером:

источники стрим эффекты HRTF/3D микс out reverb/EQ/фильтр сумма, без клиппинга каждый узел обрабатывает буфер за буфером; микс суммирует источники в шины, следит, чтобы сумма не вышла за ±1.0 (клиппинг = искажение)

Источники (декодированные сэмплы/стримы) → эффект-узлы (reverb, EQ, low-pass — каждый трансформирует поток) → спатиализация → микшер (суммирует источники в шины с приоритетами/громкостью, не давая сумме заклиппить за ±1.0) → выход (стерео/5.1/7.1).

Спатиализация: HRTF

Как передать 3D-позицию источника? HRTF (Head-Related Transfer Function) — измеренные фильтры того, как звук с данного направления искажается головой/ушами до барабанной перепонки (межушная разница по времени и громкости + частотная окраска). Свёртка потока с HRTF-откликом для направления источника даёт бинауральное стерео: в наушниках мозг локализует «взрыв в (10,0,5)» вокруг головы. На колонках — панорамирование в surround.

Динамика: адаптивная музыка и процедурное аудио

Всё это упаковывает мидлварь (FMOD/Wwise): DSP-граф, спатиализация и адаптивная музыка как event-driven и параметрический авторинг — саунд-дизайнер триггерит события и крутит параметры без кода движка.

🕹 Во что поиграть — и что заметить

Аудио надо слушать в наушниках — спатиализацию и слои не увидеть.

Hades адаптивная музыка слоями

Эталон вертикальных слоёв: исследование → бой (барабаны/гитара врубаются) → зачистка (спадают). Переходы бесшовные — это кроссфейд стемов по состоянию боя, а не смена трека.

🎮 Сыграй: в Hades послушай музыку до боя, в бою и после — заметь, как слои добавляются и убираются без разрыва (один темп/тональность, меняется плотность). Это адаптивная музыка: не «переключили песню», а досводили слои под геймплей-состояние.

Hellblade: Senua's Sacrifice бинауральный HRTF

Знаменитая бинауральная запись: голоса в голове Сенуа спатиализованы вокруг тебя. В наушниках мозг локализует их сзади/сбоку — прямая демонстрация HRTF.

🎮 Сыграй: Hellblade обязательно в наушниках — заметь, как голоса ощущаются позиционно (сзади, слева), а не «в стерео». Это HRTF-свёртка направления в бинауральный сигнал. Сними наушники — иллюзия рушится (HRTF рассчитан на два независимых уха).

Дропаут/щелчок буфер-андерран вживую

В нагруженной или плохо оптимизированной игре звук иногда «трещит»/заикается — это аудио-поток не успел заполнить буфер к дедлайну (underrun). Слышно мгновенно, в отличие от просевшего FPS.

🎮 Заметь: поймай момент, когда игра тормозит и звук трещит — это промах аудио-дедлайна. Сравни с визуальным лагом: кадр можно «проглотить», щелчок — нет. Вот почему аудио дают отдельный высокоприоритетный поток с жёстким крошечным буфер-дедлайном.

Хардкор · DSP: дискретизация, буфер-дедлайн, микс и свёрткаможно пропустить

Дискретизация и Найквист

Непрерывный сигнал берут R раз/сек; по Найквисту точно представимы частоты до R/2. Выше — алиасинг (высокая частота маскируется под низкую), поэтому перед дискретизацией ставят анти-алиас low-pass. 48 кГц → потолок 24 кГц, с запасом над слухом (~20 кГц). Битность (16/24) задаёт динамический диапазон (шаг квантования амплитуды) — прямой аналог fixed-point precision.

Real-time колбэк

Аудио-callback — это hard real-time: в нём нельзя аллоцировать память, брать локи, ходить в файлы — всё, что может заблокироваться дольше дедлайна буфера, вызовет underrun и щелчок. Отсюда правила аудио-программирования: lock-free очереди для связи с игровым потоком, пре-аллокация, стриминг с диска в отдельном (не аудио) потоке. Дедлайн N/R — 5–10 мс — и промах слышен, а не «сглаживается».

Микс, клиппинг и свёртка

Микс — сумма сэмплов источников; если сумма выходит за ±1.0, происходит клиппинг (обрезание пика = резкое искажение), поэтому нужны громкости шин, лимитеры/компрессоры. Reverb и HRTF — это свёртка потока с импульсным откликом (комнаты или уха): выход = вход ∗ IR. Длинные IR считают быстрой свёрткой через FFT (partitioned convolution) ради дедлайна. Тот же матаппарат, что в фильтрах сигналов вообще.

Хардкор · дизайн: адаптивная музыка, процедурное аудио, мидлварьможно пропустить

Горизонтальное vs вертикальное

Адаптивная музыка бывает вертикальной (слои-стемы одного трека врубаются/спадают по интенсивности — Hades) и горизонтальной (пересборка секций: intro→loop→bridge→outro по состоянию, со стыковкой на музыкальных долях, чтобы не рвать ритм). Часто комбинируют. Ключевая тонкость — переходы на бите: смена/кроссфейд приурочены к такту, иначе слышен шов.

Процедурное: функция вместо выхода

Записанный звук — фиксированный ассет; процедурный — генератор (синтез из осцилляторов, шума, огибающих, физ-моделей). Плюсы: бесконечная вариация (никогда два одинаковых шага/выстрела), крошечная память, параметризация по геймплею (скорость, поверхность, материал). Минус — реализм и нужна экспертиза DSP-синтеза. Это ровно «храни функцию, а не материализованный выход», применённое к звуку.

Зачем мидлварь

FMOD/Wwise выносят DSP-граф, спатиализацию и адаптивную логику в визуальный авторинг для саунд-дизайнера: он собирает события, шины, параметры и переходы без кода, а движок лишь триггерит события и шлёт параметры. Это разделение труда (как шейдер-граф для художника) — и причина, по которой ААА почти не пишут аудио на голых API.

Аналогия
Аудио-система — это повар у бесконечного конвейера. Лента динамика утаскивает поднос сэмплов каждые несколько миллисекунд, что бы ни случилось; аудио-поток обязан иметь следующий поднос готовым — иначе к ушам едет пустой поднос (щелчок). В отличие от «графического повара» (тот иногда подаёт блюдо с опозданием — это дропнутый кадр, глаз почти не заметит), опоздание аудио-повара слышно мгновенно. Поэтому у звука свой выделенный повар (поток) со строгим крошечным дедлайном, и всё — эффекты, микс, 3D — делается поднос-за-подносом на ленте, без остановок.
Почему это важно
Аудио — невидимая половина game feel (обратная связь, вес удара, погружение), и технически это жёсткий real-time DSP с дедлайном тоньше и менее прощающим, чем кадровый: щелчок режет ухо сильнее, чем просадка FPS — глаз. Понимать его как сигнальный граф с буфер-колбэком, спатиализацию через HRTF-свёртку и адаптивно/процедурно генерируемый звук — часть инженерной картины. А форма (потоковый real-time сигнальный пайплайн с жёстким дедлайном) обобщается на любую систему обработки сигналов и стримингового инференса.
🔁 За пределами игр — куда это переносится
Урок — это потоковая real-time обработка сигнала под жёстким дедлайном: буфер-колбэк, DSP-граф, свёртка, дискретизация.

ML / AI (твой домен): аудио-DSP — форма стримингового инференса, особенно audio-ML. Буфер-колбэк-дедлайн ⇄ латентный бюджет стриминговых ASR/TTS: потоковый TTS обязан выдавать аудио-чанки прежде, чем опустеет буфер, — тот же underrun-констрейнт (и прямо про TTS-задержку LLM-NPC). Дискретизация/Найквист ⇄ основа любого сигнального ML, а «звук в дискретные кадры» ⇄ аудио-токены VQ-VAE (кодбук аудио — см. дискретизацию). HRTF-свёртка ⇄ свёрточные примитивы и spatial-audio ML. Адаптивная музыка (состояние → выбор слоя) ⇄ управляемая/условная генерация. Процедурное аудио (синтез vs запись) ⇄ генеративное vs retrieval («храни функцию, а не выход»). А нейро-вокодеры/RAVE/нейро-TTS — это уже DSP-граф с обученным узлом: фронтир, где DSP встречает ML. Выделенный аудио-поток с крошечным дедлайном ⇄ изоляция латентно-критического пути инференса.

Сигналы / DSP: дискретизация, свёртка/фильтры, FFT, real-time буферизация — общая база аудио, радио, сенсоров, управления.

Real-time системы: hard-deadline колбэк без блокировок (lock-free, пре-аллокация), стриминг с backpressure, отдельный приоритетный поток под латентно-критику.

Принцип: у потоковой обработки под дедлайном промах слышен/виден сразу — изолируй критический путь на свой поток, не блокируйся в колбэке, считай буфер за буфером.

🔧 Запусти и поковыряй — на домашнем компе
Во что играть — выше (🕹). Здесь — потрогать сигнал.
🔧 Поковырять (FMOD Studio / Web Audio) ~40 мин
Скачай FMOD Studio (бесплатно) или в браузере через Web Audio API: собери простой DSP-граф (источник → reverb → выход), покрути размер буфера и услышь размен латентность↔дропауты. Сделай мини-адаптивный трек из двух стемов с кроссфейдом по параметру. Синтезируй процедурный «шаг» (синус-импульс + шум с огибающей) и подстрой под «поверхность».
🧪 Потестить (слух) ~15 мин, наушники
Сыграй в Hellblade/Hades в наушниках: локализуй источники (HRTF) и услышь слои музыки (адаптив). Затем в любой игре поймай буфер-андерран (щелчок под нагрузкой). Сформулируй, почему аудио-колбэк нельзя блокировать (аллокация/лок/файл) и как это связано с TTS-стримингом.
Чеклист: собрал DSP-граф и услышал размен буфера; сделал кроссфейд-адаптив и процедурный шаг; локализовал HRTF в наушниках; связал аудио-дедлайн со стриминговым инференсом.
Связи
основа
Джоб-системы — аудио живёт на своём высокоприоритетном real-time потоке с жёстким буфер-дедлайном; связь с игровым потоком — lock-free.
основа
Game feel — звук — вторая половина «сочности»: удар без аудио-фидбека ощущается ватным.
смежное
LLM-NPC — стриминговый TTS упирается в тот же аудио-дедлайн (выдай чанк до опустошения буфера).
смежное
Железо-ограничения — процедурное аудио = «храни функцию, а не выход»; битность = fixed-point precision.
Вопросы пытливого ума
Почему аудио нужен отдельный поток, а дедлайн жёстче кадрового?
Потому что промах слышен мгновенно и резко, а визуальный — почти нет. Пропущенный кадр — это микро-заминка, которую глаз и мозг сглаживают; пропущенный аудио-буфер — динамик проигрывает тишину/мусор, то есть отчётливый щелчок, который ухо ловит сразу. Плюс аудио потребляется непрерывно и равномерно (лента сэмплов не останавливается), тогда как рендер может «нагнать» после просадки. Делить плавающий тайминг главного потока (где кадр то 12, то 30 мс) аудио не может — ему нужен ровный поток буферов к жёсткому дедлайну N/R. Отсюда выделенный высокоприоритетный поток и запрет блокировок в колбэке.
Что именно делает HRTF и почему это работает только в наушниках?
HRTF кодирует, как звук с конкретного направления искажается твоей головой и ушами до барабанной перепонки: приходит в одно ухо чуть раньше и громче (межушные разницы), и по-разному окрашивается по частоте формой ушной раковины. Свёртка моно-источника с HRTF для его направления даёт два разных сигнала — в левое и правое ухо, — и мозг восстанавливает позицию. Работает в наушниках, потому что там каждое ухо получает ровно свой сигнал. На колонках звук из левой доходит и до правого уха (crosstalk), ломая тонкие межушные разницы, — поэтому там ограничиваются панорамированием/surround, а полноценный бинаурал требует изоляции ушей (наушники) или сложной crosstalk-cancellation.
Размер буфера: почему нельзя просто взять маленький ради низкой задержки?
Потому что маленький буфер = узкий дедлайн: аудио-поток должен успевать заполнять его чаще, и любой скачок нагрузки (сложный микс, планировщик ОС не дал время) вызывает underrun → щелчок. Большой буфер безопаснее (запас времени), но добавляет задержку: звук отстаёт от действия (нажал — выстрел через 20 мс), что бьёт по game feel и особенно по ритм-играм/VR. Это классический размен: латентность N/R против устойчивости к джиттеру. Выбирают минимальный буфер, который стабильно успевает на целевом железе (обычно 128–512 сэмплов), — как минимальный fixed-timestep, который не срывается в спираль.
Процедурное или записанное аудио — что лучше?
Разные компромиссы, как везде «функция vs выход». Записанное — максимальный реализм и контроль (звукорежиссёр слышит финал), но фиксированные ассеты: память растёт, и повтор заметен («тот же звук шага 1000-й раз»). Процедурное — бесконечная вариация (никогда не повторится), крошечная память и параметризация по геймплею (скорость/поверхность/материал меняют синтез на лету), но реализм обычно ниже и нужен навык DSP-синтеза. На практике гибрид: базу пишут, а вариацию и реактивность добавляют процедурно (рандомизация питча/старта сэмпла — простейший «полупроцедурный» приём против повторов). Выбор — по тому, что критичнее: аутентичность конкретного звука (запись) или вариативность/реактивность/память (синтез).
Зачем адаптивная музыка сложнее, чем просто «сменить трек в бою»?
Потому что резкая смена трека слышна как шов и разрушает погружение: обрыв на середине фразы, скачок тональности/темпа. Адаптивная музыка делает переход музыкально бесшовным: вертикально досводит слои того же трека (та же тональность/темп, меняется плотность — Hades) или горизонтально пересобирает секции со стыковкой на музыкальной доле (ждёт конца такта). Это требует, чтобы композитор писал музыку слоями/секциями под систему, а не линейно, а движок — чтобы переключал на бите. Цена сложности окупается тем, что музыка дышит вместе с геймплеем незаметно, а не «щёлкает» режимами.
Что почитать