33 звуковых эффекта и ни одного аудиофайла
· 4 мин чтения
Strandbreak Online шумит много: восемь основных стволов, у каждого свой выстрел; дюжина дополнительных, которые берут голос того оружия, на которое больше всего похожи; попадания и критические попадания, смерти и смерти элитных врагов, подборы, повышения уровня, взрывы и босс с пятью собственными звуками. Всего тридцать три звуковых эффекта, и при этом в загрузке игры нет ни одного аудиофайла.
Как это работает
Каждый звук — короткий рецепт, записанный как данные: какие осцилляторы, какая огибающая громкости, фильтр, немного шума. При запуске игры эти рецепты рендерятся в сырые буферы сэмплов — ровно то, во что декодировался бы аудиофайл, — и воспроизводятся оттуда.
Цена, измеренная в браузере, — 37 миллисекунд на рендер одиннадцати звуков, которые стоит иметь наготове к моменту, когда браузер разрешит звук, при 48 000 сэмплах в секунду. Остальные рендерятся при первом воспроизведении. Цена для загрузки — ноль байт.
Выигрыш, которого никто не ждёт: звук можно тестировать
Меньшая загрузка приятна, но важнее другое: код, превращающий рецепт в сэмплы, чистый, то есть он не трогает ни аудиосистему браузера, ни страницу. Значит, он запускается в обычном тесте, на машине без колонок, и тест может делать утверждения про каждый звук в игре:
- Он слышен. Его громкость выше порога. Рецепт с опечаткой, который рендерит тишину, ломает сборку.
- Он никогда не клиппует. Ни один сэмпл не выходит за максимум.
- В нём нет ничего битого — никаких недопустимых чисел.
- У него нет постоянной составляющей (DC offset) — постоянного смещения в одну сторону, от которого динамики бухают.
- Он начинается и заканчивается тишиной, поэтому не щёлкает.
- Он детерминирован: один и тот же рецепт каждый раз даёт одни и те же сэмплы.
- Он отличается от всех остальных звуков. Если два сигнала случайно делят один рецепт, тест падает.
- У каждого основного ствола свой выстрел, а каждое оружие в игре, включая дополнительное, ссылается на существующий звук.
Ничего из этого не проверить на слух. Самый важный сбой — «событие срабатывает, а звука нет» — не виден на скриншоте и легко теряется в плейтесте, потому что игрок занят. С аудиофайлами всё это свелось бы к человеку, который один раз прощёлкивает звуки в наушниках — и больше никогда.
Три вещи, которые должен уметь микшер игры с толпами врагов
Игра, где на экране могут быть сотни врагов, запрашивает звуки быстрее, чем кто-либо способен их услышать. Без правил микс превращается в кашу или в шум.
У каждого звука есть минимальный интервал и бюджет голосов. В одном кадре может быть пятьдесят событий попадания. Сыгранные как пятьдесят наложенных звуков, они просто громкие. В браузерном тесте пятьдесят одновременных запросов звука попадания теперь дают два голоса. Ухо разницы не слышит, а остальной микс выживает.
Пик каждого рецепта нормализован. Насколько один звук громче другого, решается в таблице рецептов, а не громкостью отдельных слоёв, поэтому правка того, как звук устроен, не меняет втихую его громкость.
На мастер-выходе стоит лимитер. Сорок голосов звука с пиком 0,3 в сумме дают намного больше максимума, а то, что браузер делает выше максимума, — это слышимые искажения. Мягкий лимитер удерживает сумму в пределах.
Mute и duck — разные вещи
Ещё одно правило, усвоенное на горьком опыте предыдущей игры. Когда странице нужно, чтобы игра притихла — например, на время рекламы, — игра делает duck: плавно затихает и так же плавно возвращается, когда реклама закончилась. Когда игрок нажимает «без звука», игра замолкает. Это два разных переключателя. Если это один переключатель, конец рекламы включает звук игроку, который просил тишины. Это тоже проверяется в браузере: mute, включённый во время duck, переживает окончание duck.
Общий вывод
О генерации ассетов в коде обычно спорят с точки зрения размера. Аргумент посильнее в том, что всё, что порождает чистая функция, можно тестировать как любой другой код, а звук — одна из наименее протестированных частей большинства игр. Если звук не может проверить машина, рано или поздно он сломается, и никто не заметит.
Сыграйте в Strandbreak Online — со звуком.
