Как добавить звук и музыку в игру: практическое руководство
У звука в игре три задачи: сообщить игроку, что только что произошло, задать настроение музыкой и фоновым шумом и сделать каждое важное событие слышимым. Это руководство разбирает звуковые слои, которые нужны каждой игре, форматы файлов для каждого из них, как воспроизводить звуки без заиканий и где проходит граница между встроенным в движок звуком и специализированным решением вроде FMOD или Wwise. Написано для 2D-игр и опирается на то, как цифровой звук устроен на самом деле — частоту дискретизации, уровни громкости и звуковые классы .NET, на которых держится аккуратная звуковая система, — без выдуманных процентов.
У звука в игре три задачи, и любая выпущенная игра выполняет их все — хочет того разработчик или нет. Звук сообщает игроку, что только что произошло: в ту секунду, когда срабатывает прыжок, попадает выстрел, открывается меню, раздаётся звук. Он задаёт настроение музыкой и фоновым шумом. И он делает важные события слышимыми, чтобы ничто значительное не проходило в тишине. Игра может быть красивой и точно настроенной, но без звука ощущаться плоской; та же игра со звуком, который попадает в цель, ощущается отзывчивой и живой.
Это руководство — практическая версия для 2D-игр. Здесь разобраны слои, которые нужны каждой игре, форматы файлов, способы воспроизводить звук без заиканий и чёткая граница между встроенным звуком движка и специализированным решением. Всё опирается на то, как цифровой звук устроен на самом деле, — без выдуманных процентов про то, насколько звук «повышает вовлечённость».
Три слоя, которые нужны каждой игре
Разбейте звук на три слоя и обращайтесь с каждым по-своему — у них разные требования.
| Слой | Что это | Типичный формат | Как воспроизводится |
|---|---|---|---|
| Звуковые эффекты (SFX) | Разовая обратная связь — прыжки, удары, подбор предметов, щелчки интерфейса | WAV (без сжатия) | Срабатывает по событию |
| Музыка | Фоновая партитура, часто зацикленная | Ogg Vorbis или MP3 (сжатый) | Потоковая, долгая |
| Фоновый шум и интерфейс | Атмосферные подложки (ветер, толпа) и звуки интерфейса | Смешанный | Зацикленная или разовая |
Причина такого разделения — в затратах ресурсов. Эффект, который звучит пятьдесят раз в минуту, обязан запускаться дёшево и не выделять память при каждом срабатывании. Музыка, длящаяся минутами, должна идти потоком и быть сжатой: без сжатия один трек съел бы сотни мегабайт.
Выберите правильный формат файла
Аудиоформаты — это компромисс между размером, стоимостью распаковки и качеством. Подбирайте формат под ресурс.
| Формат | Сжатие | Типичное применение | Компромисс |
|---|---|---|---|
| WAV | Без сжатия (сырой PCM) | Короткие звуковые эффекты | Файл крупный, но мгновенная загрузка и воспроизведение без затрат на распаковку |
| Ogg Vorbis | Сжатие с потерями | Музыка, фоновый шум | Маленький, хорошее качество, небольшая нагрузка на процессор при распаковке |
| MP3 | Сжатие с потерями | Музыка | Универсальный, но бесшовное зацикливание даётся труднее |
| FLAC | Сжатие без потерь | Архив, в игре обычно не нужен | Меньше WAV, но больше сжатых форматов; в игре редко себя оправдывает |
Распространённая ошибка — использовать один формат для всего. Несжатый WAV для пятиминутной музыки впустую тратит память; сжатый Ogg для выстрела добавляет распаковку при каждом проигрывании. Держите музыку сжатой, а эффекты — несжатыми, и большая часть проблемы с форматами решена.
Частота дискретизации и разрядность: правило Найквиста
Цифровой звук берёт отсчёты звуковой волны много раз в секунду. Эту дискретизацию описывают два числа: частота дискретизации (сколько отсчётов в секунду) и разрядность (насколько точно хранится каждый отсчёт).
Правилом, которое связывает частоту с воспроизводимостью, служит теорема Найквиста — Шеннона: чтобы воспроизвести частоту, частота дискретизации должна более чем в два раза превышать её. Верхняя граница человеческого слуха — около 20 кГц, поэтому стандарта аудио-CD в 44,1 кГц хватает, чтобы покрыть весь слышимый диапазон, а 48 кГц (стандарт видео и современных игр) дают комфортный запас.
| Настройка | Что означает | Когда применять |
|---|---|---|
| 44,1 кГц, 16 бит | Качество аудио-CD | Подходит для большинства игровых звуков |
| 48 кГц, 16 бит | Совпадает с видеопроизводством | Безопасный стандарт для современных игр |
| Выше 48 кГц | Неслышимое улучшение | Редко оправдывает потраченную память |
Большая разрядность (24 бита) важна при записи и сведении, а не в финальном файле, который слышит игрок. Частоты выше 48 кГц в выпущенной 2D-игре тратят память впустую — человеческое ухо разницы не заметит.
Воспроизведение звука: «запустил и забыл» или управляемый голос
В большинстве звуковых API звук можно запустить двумя способами, и разница существенная.
Воспроизведение «запустил и забыл» берёт звук и проигрывает его один раз без дальнейшего управления. Идеально для шага или щелчка интерфейса — запустил и пошёл дальше. В MonoGame и XNA это SoundEffect.Play().
Управляемый голос — это дескриптор, который вы сохраняете, чтобы менять громкость, высоту, панораму или зацикливание во время звучания и останавливать звук по требованию. В MonoGame это SoundEffect.CreateInstance() и класс SoundEffectInstance. Он нужен, когда свойства звука зависят от игры: двигатель, высота которого растёт со скоростью; заряд, громкость которого нарастает, пока вы его удерживаете.
| Потребность | Что использовать |
|---|---|
| Щелчок, шаг, удар — проиграть и забыть | «Запустил и забыл» |
| Зацикливание, громкость, привязанная к игре, сдвиг высоты, остановка по требованию | Управляемый голос |
| Фоновая музыка | Отдельный музыкальный API (Song), который идёт потоком |
Музыка — отдельный случай. Используйте музыкальный API движка, который проигрывает сжатый звук потоком с диска, а не грузит весь трек в память. Загружать пятиминутную песню как звуковой эффект — верный способ впустую потратить оперативную память.
Держите звуки в пуле и ограничивайте наложение
Главная причина заикания и пропадающих звуков — та же проблема лишних выделений памяти, что портит частоту кадров. Если каждый выстрел создаёт новый ресурс воспроизведения, а вы стреляете десять раз в секунду, память расходуется впустую, и звуковая система не справляется.
Решение то же, что устраняет выделения в каждом кадре в остальной игре: заведите фиксированный пул переиспользуемых голосов и крутите их по кругу. Это ровно приём с пулом объектов, убирающий рывки от сборки мусора, только применённый к звуку. Вторая связанная привычка — ограничить, сколько копий одного звука может звучать одновременно: десять наложенных шагов не звучат в десять раз громче, они звучат грязно и впустую тратят голоса.
Сведение: уровни громкости и громкость как мера
Чистый микс строится на разделении звука на уровни громкости, которые можно балансировать независимо:
- Мастер — общий уровень выходного сигнала и выключатель звука.
- Музыка — партитура, балансируется относительно всего остального.
- SFX — эффекты, самый громкий слой, потому что они несут обратную связь.
- Фоновый шум — атмосферные подложки, обычно самые тихие.
Дать игроку раздельные регуляторы громкости музыки и эффектов — базовая функция доступности, а не излишество. Помимо структуры, практические привычки сведения просты: не давать самым громким звукам уходить в перегруз (клиппинг), оставляя запас по уровню, и применять приглушение музыки (ducking) — автоматически снижать её громкость, когда звучит важная реплика или громкий эффект, чтобы ничто не перекрывало то, что действительно важно.
Для одинаковой громкости во всём проекте звукорежиссёры измеряют её в LUFS (loudness units relative to full scale). Стриминговые платформы и вещательные стандарты нормализуют звук под определённые значения в LUFS; соответствие им не даёт трекам звучать тише или громче всего остального. Чтобы выпускать проект, не обязательно быть мастером теории звука, но знать, что громкость — измеримая величина, а не просто ползунок, — это и есть разница между ровным миксом и миксом с резкими перепадами уровня.
Пространственный звук в 2D
Полноценный трёхмерный позиционный звук — звук, который словно исходит из точки в пространстве с затуханием по расстоянию и направлению, — принадлежит 3D-играм и специализированным решениям. В 2D обычно нужны два более простых эффекта:
- Панорамирование — звук справа по экрану идёт из правого динамика.
- Затухание по расстоянию — источник звука дальше от игрока звучит тише.
Оба легко вычислить. Позиционируйте звуки, несущие информацию о расположении (враг за экраном, предмет слева), а глобальные звуки (интерфейс, музыка) оставляйте плоскими.
Когда нужно специализированное решение
Встроенный звук движка покрывает подавляющее большинство 2D-игр. Обращаться к специализированному решению стоит, когда этого требует конкретная функция.
| Решение | Разработчик | В чём силён | Типичная сфера |
|---|---|---|---|
| FMOD | Firelight Technologies | Привычный интерфейс с временной шкалой, удобен для инди | Распространён в инди-играх |
| Wwise | Audiokinetic | Продвинутое пространственное звучание, глубокая интерактивность | Распространён в AAA |
Ни FMOD, ни Wwise не являются цифровыми звуковыми рабочими станциями (DAW); это специализированные решения, с которыми игра общается, запуская события. Настоящая причина их подключать — интерактивная музыка, которая наслаивается и подстраивается под игру в реальном времени, сложный параметрический звук или продвинутое позиционирование. Специализированное решение несёт реальную нагрузку на интеграцию и обучение, поэтому добавляйте его под конкретную потребность — не в первый день и не «на всякий случай, вдруг пригодится».
Ошибки, которые ломают хорошую звуковую систему
- Один формат для всего. Сжатая музыка и несжатые эффекты служат разным целям.
- Новый звук на каждое срабатывание. Заведите пул переиспользуемых голосов.
- Нет ограничения на наложение звуков. Десять копий шага звучат хуже, чем одна.
- Нет уровней громкости. Без раздельных регуляторов музыки и эффектов сведение превращается в борьбу, и игрок не может это исправить.
- Загрузка музыки в память. Пропускайте её потоком.
- Слишком раннее обращение к специализированному решению. Большинству 2D-игр оно никогда не понадобится.
- Тишина там, где должна быть обратная связь. Каждое важное действие игрока заслуживает звука.
Роль Egmatic
Egmatic — это 2D-редактор и движок на базе MonoGame, поэтому он использует те же звуковые классы, которые уже знает каждый разработчик на MonoGame и XNA: SoundEffect для коротких эффектов, SoundEffectInstance для управляемого воспроизведения и Song для потоковой музыки. Это важно по двум причинам. Во-первых, звуковая модель проверенная и хорошо задокументированная, а не проприетарная, поэтому всё, что вы узнаете о звуке в MonoGame, применимо напрямую. Во-вторых, живой предпросмотр Egmatic позволяет поставить источник звука, тут же его услышать и подобрать громкость или высоту, пока он не впишется в микс, — превращая отладку звука в быстрый цикл обратной связи вместо «правка — сборка — запуск».
Если вы только знакомитесь с движком, на котором построен Egmatic, наше руководство о MonoGame объясняет эту базу. А поскольку хороший звук держится на той же дисциплине выделений памяти, что и стабильная частота кадров, руководство по производительности 2D разбирает привычку с пулом, которую рекомендует и эта статья.
Заключение
Звук в игре — не слой, который добавляют в самом конце. Это обратная связь, настроение и ясность, собранные из трёх слоёв — эффектов, музыки и фонового шума, — каждый в правильном формате и воспроизводимый правильным способом. Используйте несжатые форматы для коротких эффектов и сжатые для музыки, держите голоса воспроизведения в пуле, разделяйте микс на уровни громкости и подключайте специализированное решение только тогда, когда этого требует реальная функция. Сделайте это — и ваша игра перестанет быть немой картинкой и зазвучит так, как должна.