Хабрахабр

[Перевод] Оптимизируем производительность игры параметрами импорта звука Unity

image

Разработчики обычно не до конца понимают параметры импорта звука в Unity, и на момент написания статьи я не смог найти ни одного подробного руководства по их использованию. В документации Unity хорошо описано то, что делают параметры импорта звука, но я хотел бы разобрать эти описания для более широкой аудитории, а также более детально объяснить, как применять эти параметры, чтобы выжать из игры максимум производительности.

Этот документ разделён на пять частей:

  1. Как звук влияет на производительность
  2. Разбираемся с параметрами импорта
  3. Рекомендуемые мной параметры для PC и консолей
  4. Рекомендуемые мной параметры для мобильных платформ
  5. Предостережения и замечания

Оптимизация параметров импорта звука Unity — один из простейших способов оптимизации. В случае небольшого проекта у вас может уйти меньше часа для достижения значительных улучшений во времени загрузки, занятой ОЗУ и других аспектах производительности. Надеюсь, это руководство окажется полезным для вас. Информация актуальна для Unity версии 2018.3
Звуковые данные объёмны. Во многих играх звуковые данные занимают львиную долю дискового пространства (места на диске/картридже/оптическом диске, где хранятся данные игры) и ОЗУ (рабочей памяти системы). Но мало того, они ещё и серьёзно нагружают ЦП, особенно если вы используете эффекты DSP (обработки звука в реальном времени), а также сильно увеличивают время загрузки.

Если какой-то из аспектов игры причиняет вам наибольший урон, то можно сохранить эффективность одного аспекта, пожертвовав другим. В трёх этих областях (пространство на диске, занимаемое ОЗУ, использование ЦП) оптимизация является трёхсторонним перетягиванием каната, похожим на проблему «хорошо-дёшево-быстро». Ниже показана диаграмма с различными параметрами и их влиянием на эти три области: Например, если несжатый звук занимает слишком много ОЗУ, то можно хранить его в сжатом Vorbis виде — это экономит место в ОЗУ, но ценой нагрузки на ЦП, потому что при доступе к сжатому файлу для его декодирования требуется бОльшая вычислительная мощность.

Стоит учесть, что эта диаграмма ничего не говорит нам о полосе пропускания данных, считываемых с диска/ОЗУ.

Чтобы понимать, как использовать эти параметры (и справляться с такими проблемами, как слишком долгое время загрузки), нужно подробно рассмотреть каждый из параметров импорта звука. В реальности нюансов немного больше, но диаграмма должна дать вам общее представление о том, как взаимосвязаны эти проблемы.

При выборе AudioClip в редакторе Unity в окне инспектора появляется следующая панель:

Ниже представлен список параметров звука сверху вниз с описанием того, что они делают:

Force to Mono

  • Yes: если AudioClip записан в стерео (или с другим количеством каналов), то этот параметр сводит все каналы в один моноканал.
  • No: количество каналов не меняется.

В своей работе дизайнером звука я никогда не свожу аудиосигнал к моно, потому что создаю звуки с определённой целью. Но если вы используете стандартные звуки из стоков и хотите включить этот параметр, то убедитесь, что сведённый в моно файл не звучит плоско и странно из-за межфазного взаимодействия левого и правого каналов. Обработанный звук можно предварительно прослушать, нажав кнопку Play в нижнем правом углу окна инспектора — если вы слышите фазовые искажения, то можете попробовать разделить звук в стороннем аудиоредакторе и по отдельности эспортировать левый и правый каналы как монозвук.

Normalize (доступно только при включенном Force to Mono)

  • Yes: регулирует коэффициент усиления AudioClip так, чтобы превращённый в моно звук имел ту же громкость, что и исходный стереофайл.
  • No: не регулирует коэффициент усиления.

Если вы используете Force to Mono, то обычно стоит включать нормализацию. Громкий стереофайл при сведении в моно может стать ещё громче, превысить максимальную аплитуду и привести к резкому цифровому искажению, что нежелательно.

Load in Background/Preload Audio Data

Эти параметры имеют непосредственное влияние друг на друга, поэтому я объединил их.

Load in background

Preload audio data

Результат

Enabled

Enabled

При загрузке сцены аудиоклипы с этим параметром начинают загружаться, но не останавливают основной поток. Если к моменту полной загрузки сцены не все они загрузились, то загрузка продолжится в фоновом режиме, когда сцена уже будет работать. Если звук не загружен, но уже запущен, то он будет вести себя так же, как при отключенном Preload (см. строку ниже).

Enabled

Disabled

Когда звук запускается впервые, он загрузится в фоновом режиме и воспроизведётся, когда будет готов. Если файл большой, то между запуском и воспроизведением может появиться заметная задержка, но при последующих воспроизведениях файла всё будет в порядке.

Disabled

Enabled

Звук грузится в процессе загрузки сцены. Сцена не запустится, пока все звуки с этим включенным параметром не загрузятся в память.

Disabled

Disabled

Когда звук запускается в первый раз, для загрузки себя в память он использует основной поток — если файл большой, это может вызвать торможение кадров, но при последующих воспроизведениях всё будет в порядке.

Рекомендую использовать такую конфигурацию только для очень маленьких файлов, но даже в этом случае стоит замерить её влияние на производительность в профайлере, и подумать, может ли большое количество таких звуков запускаться одновременно, увеличивая нагрузку на производительность.

Ambisonic

  • Поставьте этот флажок, если звук закодирован Ambisonic. Звуки Ambisonic полезны для VR, AR, панорамного видео и т.д., но к нашему руководству этот параметр не имеет отношения.

Параметры, специфичные для платформ

  • Эти вкладки позволяют задавать параметры по умолчанию и специфичные для платформ параметры у настроек, перечисленных ниже. На некоторых платформах есть форматы сжатия, недоступные на других, на некоторых может быть другое оборудование, требующее другой оптимизации. Подробности о специфичном для платформ сжатии см. в замечаниях ниже.
  • Всегда проверяйте специфичные для платформ параметры, даже если хотите использовать общие параметры — иногда Unity может автоматически задавать специфичные для платформ параметры. Например, в сборках для iOS может по умолчанию стоять «specify sample rate: 22kHz», что способно приводить к алиасингу (звуковому дефекту, возникающему из-за неверном снижении дискретизации).

Load type

  • Decompress on Load: звук хранится на диске в указанном формате сжатия (Compression Format), но распаковывается и загружается в ОЗУ несжатым в формате PCM. Это занимает много ОЗУ и немного увеличивает время загрузки, но очень малозатратно с точки зрения процессора, а доступ осуществляется очень быстро.
  • Compressed in Memory: и на диске, и в ОЗУ звук хранится в указанном формате сжатия. Занимаемое в ОЗУ место и время загрузки снижаются, но повышается нагрузка на процессор при воспроизведении звука, потому что его при каждом воспроизведении его необходимо распаковывать.
  • Streaming: потоковое воспроизведение звука выполняется непосредственно с диска, полностью минуя ОЗУ. Это занимает часть пропускной способности диска и ресурсов ЦП, но на PC и консолях не сильно влияет на производительность при условии, что одновременно выполняется потоковое воспроизведение не более чем двух звуков. На мобильных платформах (особенно на дешёвых и старых устройствах) одновременное потоковое воспроизведение нескольких стереофайлов сильно нагружает процессор (см. ниже раздел «Предостережения»).

Compression Format

  • PCM: сырые аудиоданные, полностью распакованы и занимают много пространства на диске и в ОЗУ, но на их воспроизведение практически не нужны затраты, потому что не требуется распаковка.
  • ADPCM: очень старый формат сжатия с коэффициентом сжатия 3,5:1. Сжатие/распаковка довольно малозатратны по сравнению с Vorbis или другими форматами сжатия, но вносят в звук артефакты цифрового шума, поэтому использовать нужно только в «шумных звуках», в которых это не будет заметно. Если вы не уверены, подойдёт ли ADPCM для какого-то конкретного звука, то включите предварительное прослушивание звука в форматах PCM и ADPCM — если вы услышите разницу, то рекомендую выбирать PCM.
  • Vorbis: сжатый формат, совместимый с большинством популярных платформ. Может обеспечивать достаточно высокие коэффициенты сжатия, сохраняя при этом достойное качество звука, но при сжатии и распаковке на лету довольно затратен.

Я перечислил здесь только стандартные форматы редактора, подробнее о специфичных для платформ типов и о компрессии см. ниже в разделе «Замечания».

Вот краткое сравнение загрузки процессора для разных форматов на моём PC в редакторе Unity:

Формат сжатия

Загрузка ЦП при 1 голосе

Загрузка ЦП при 6 голосах

PCM

~0,05%

~0,3%

ADPCM (сжатый в памяти)

~0,2%

~1,0%

Vorbis (сжатый в памяти)

~0,5%

~3,2%

Quality (не относится к PCM/ADPCM)

  • 70-100%: практически неотличимо от PCM в полном качестве для всех, кроме аудиофилов с дорогим звуковым оборудованием
  • 1-69%: варьирующийся уровень качества, нижние значения создают сильные отталкивающие артефакты шума, уменьшают динамику и делают звук плоским и безжизненным. Можно нажать кнопку предварительного прослушивания в панели инспектора, чтобы узнать, насколько заметно падает качество каждого конкретного звука.

Эти параметры качества подразумевают, что звук будет воспроизводиться со скоростью 100%, поэтому они обрезают некоторые верхние частоты, которые обычно находятся вне слышимого диапазона. Но при воспроизведении на пониженной скорости они смещаются вниз, в слышимый диапазон. Если вы планируете воспроизводить звук с низким тоном/скоростью, то лучше выберите кодирование в PCM.

Чем ниже качество, тем сильнее сжимаются файлы:

Качество Vorbis

% от исходного размера

Коэффициент сжатия

100

~20%

~5:1

75

~10%

~10:1

50

~7%

~14:1

25

~4%

~25:1

1

~2%

~50:1

Sample Rate Setting

  • Preserve: использует частоту дискретизации, с которой записан звук.
  • Optimise: Unity анализирует звук и находит его максимальную частоту, а затем использует теорему Нюквиста для определения наименьшей частоты дискретизации, которую можно применить без потери этих частот. Например, если максимальная частота звука равна 10 кГц, то частоту дискретизации можно без потери содержимого звука можно понизить до 20 кГц. Этот параметр можно использовать только для PCM/ADPCM.
  • Override: при желании можно вручную задать для AudioClip новую частоту дискретизации. В общем случае я не рекомендую этого делать, если вы не понимаете, к чему это приведёт.

Тип звука

Load in background

Load type

Preload audio data

Compression format

Quality

Sample rate setting

Замечания

Диалоги

Y

Compressed in memory

Y

Vorbis

70

Preserve

 

Длинные лупы звуков окружения

n/a

Streaming

n/a

Vorbis

70

Preserve

 

Однократные звуки окружения

Y

Decompress on load

Y

Vorbis

70

Preserve

 

Шумовые эффекты

N

Compressed in memory

Y

PCM

n/a

Optimise

Если тон этих звуков когда-нибудь понижался, то частоту дискретизации нужно сохранить

Звуки шагов

N

Compressed in memory

Y

PCM

n/a

Optimise

 

Музыка (долгие композиции)

n/a

Streaming

n/a

Vorbis

85

Preserve

Streaming может и не подходить, если одновременно воспроизводится несколько музыкальных треков

Музыка (короткие фрагменты)

Y

Compressed in memory

Y

Vorbis

85

Preserve

 

Недиалоговые голоса

Y

Decompress on load

Y

Vorbis

70

Preserve

 

Спецэффекты (SFX, короткие)

N

Compressed in memory

Y

PCM

n/a

Optimise

Если тон этих звуков когда-нибудь понижался, то частоту дискретизации нужно сохранить

Спецэффекты (долгие)

N

Decompress on load

Y

Vorbis

70

Preserve

 

Звуки UI (долгие)

Y

Decompress on load

Y

Vorbis

70

Preserve

 

Звуки UI (короткие)

N

Compressed in memory

Y

PCM

n/a

Optimise

 

Эти рекомендации подойдут для игр, где есть до 10 тысяч аудиоклипов. Для большинства звуков я рекомендую Decompress on Load, то есть в ОЗУ они будут храниться как распакованные аудиоданные. Если общий размер распакованных звуковых файлов больше ограничений, наложенных вами на ОЗУ, то для самых длинных файлов можно выбрать параметр Compressed in Memory. Но учтите, что при каждом запуске такого звука нагрузка на ЦП будет немного повышаться. Версию этих таблиц в PDF можно скачать отсюда.

Тип звука

Load in background

Load type

Preload audio data

Compression format

Quality

Sample rate setting

Замечания

Диалоги

Y

Compressed in memory

Y

Vorbis/MP3

50

Preserve

 

Длинные лупы звуков окружения

Y

Compressed in memory

Y

Vorbis

35

Preserve

Для звуков, в которых нет шумов, используйте качество повыше

Однократные звуки окружения

Y

Decompress on load

Y

Vorbis/MP3

50

Preserve

 

Шумовые эффекты

N

Compressed in memory

Y

PCM/ADPCM*

n/a

Preserve

 

Звуки шагов

N

Compressed in memory

Y

PCM/ADPCM*

n/a

Optimise

 

Музыка (долгие композиции)

n/a

Streaming

n/a

Vorbis

70

Preserve

См. ниже предостережения о потоковом воспроизведении

Музыка (короткие фрагменты)

Y

Compressed in memory

Y

Vorbis/MP3

70

Preserve

 

Недиалоговые голоса

Y

Decompress on load

Y

Vorbis/MP3

50

Preserve

 

Спецэффекты (SFX, короткие)

N

Compressed in memory

Y

PCM/ADPCM*

n/a

Optimise

Если тон этих звуков когда-нибудь понижался, то частоту дискретизации нужно сохранить

Спецэффекты (длинные)

N

Decompress on load

Y

Vorbis/MP3

50

Preserve

 

Звуки UI (долгие)

Y

Decompress on load

Y

Vorbis/MP3

50

Preserve

 

Звуки UI (короткие)

N

Compressed in memory

Y

PCM/ADPCM*

n/a

Optimise

 

*Если вы не знаете, что выбрать, PCM или ADPCM, то см. выше описание формата ADPCM в разделе «Разбираемся с параметрами». Если экономия места на диске ещё не отчаянно нужна, то рекомендую склоняться в сторону PCM.

Если вы считаете, что эти параметры могут не подойти для вашей игры, то прочитайте полные описания параметров выше. Эти рекомендации будут хорошо работать в большинстве мобильных игр; по крайней мере, их можно использовать как отправную точку. Версию этих таблиц в PDF можно скачать здесь.

Предостережения

  • Одновременное потоковое воспроизведение (Streaming) нескольких аудиофайлов представляет достаточно малую нагрузку на процессоры в PC и консолях, но может создавать серьёзную проблему на мобильных платформах (особенно на дешёвых или старых устройствах). Ниже представлен график измерений, проведённых мной в профайлере Unity. В нём оценивается влияние потокового воспроизведения нескольких аудиофайлов на различных телефонах Samsung Galaxy и моём PC. На первом графике показано 1-12 одновременно воспроизводимых аудиоисточников, на втором — 1-3 источников в увеличенном масштабе.

  • Если для звука задан параметр Decompress on Load, то использование сжатия Vorbis уменьшит в десять раз его размер на диске, но не в ОЗУ, где по-прежнему будут храниться сырые данные PCM. Если задать параметр Compressed in Memory, то можно сэкономить ОЗУ, но ценой времени ЦП, распаковывающего звук на лету.
  • Каждый тип данных за исключением Streaming по умолчанию загружает звук в ОЗУ и оставляет его там, пока сцена не будет выгружена. Если вся игра выполняется на одной большой сцене, то звуки могут заполнить всю доступную ОЗУ. Хуже того, ручное удаление аудиоклипов из ОЗУ чрезвычайно неэффективно и может привести к падению частоты кадров, что может произойти и если поручить эту задачу сборщику мусора. Если у вас много аудиоданных, то вам, возможно потребуется выполнить оптимизацию для снижения занимаемой ОЗУ в других областях, воспользовавшись AssetBundle-ами Unity. Параметр Preload Audio Data тоже не может этого изменить, потому что он определяет только то, когда данные загружаются в ОЗУ, а не то, что происходит с ними потом.
  • Если целевая платформа поддерживает формат MP3, то учтите, что для него автоматическое зацикливание не выполняется, поэтому я не рекомендую использовать сжатие MP3 для атмосферных и музыкальных лупов. Из-за особенностей кодирования MP3 к концу файла часто добавляется кусок без звука, чтобы общее количество сэмплов ровно делилось на «кадры» из 1 152 сэмплов. Существуют способы создания бесшовных лупов из MP3, но это тема для другого руководства.
  • При отключении Preload Audio Data и включении Load in Background большие файлы будут воспроизводиться не сразу, зато при этом не увеличивается нагрузка на процессор. Так происходит потому, что на загрузку требуется время, но основной поток в этом случае не простаивает.
  • При отключении Preload Audio Data и отключении Load in Background большие файлы при первом вызове занимают основной поток. Однако это не проблема при использовании FMOD, который выполняет декодирование в отдельном потоке.

Замечания

Форматы сжатия:

  • При импорте файлов в Unity они всегда должны быть в несжатом формате, например в WAVE (.wav) или AIFF (.aiff). Многие сжатые форматы являются форматами с потерями, то есть при их кодировании информация теряется. Если импортировать в Unity сжатый файл, например MP3 или Vorbis, то Unity сначала декодирует его в несжатый формат, а затем повторно закодирует в выбранный вами формат, даже если этот тот же формат, с которого вы начинали. Это может добавлять новые артефакты сжатия, что в общем случае нежелательно.
  • В документации межплатформенного ПО AudioKinetic Wwise есть отличная статья о различных форматах сжатия звука, их плюсах и минусах, а также поддерживаемых платформах.
  • Если вы используете FMOD, то у вас есть доступ к его формату FADPCM, который значительно лучше старого формата ADPCM. Однако в Unity он не встроен.
  • Возможно, что на iPhone вы захотите использовать вместо Vorbis, например формат MP3, потому что у него есть аппаратный декодер MP3, позволяющий процессору не распаковывать хранящиеся в ОЗУ или на диске файлы MP3. Но будьте аккуратны — это может не подходить для зацикленных звуков (см. выше раздел «Предостережения»); кроме того, он может декодировать только по одному MP3 за раз. Если необходимо распаковывать одновременно несколько MP3, то эта операция будет выполняться программно, как и в случае Vorbis. Это не должно представлять каких-то серьёзных проблем, но стоит заметить, что декодирование MP3 загружает процессор немного сильнее, чем декодирование Vorbis.
  • Если целевой платформой является Playstation 4, то формат ATRAC9 обеспечивает достаточно высокий коэффициент сжатия с меньшей нагрузкой на процессор, чем Vorbis или MP3.
  • Для Xbox One хорошей заменой Vorbis или MP3 послужит формат Microsoft XMA. Для наилучшей производительности и качества Microsoft рекомендует коэффициент сжатия от 8:1 до 15:1.

Разное:

  • В таблицах рекомендуемых параметров я указал для некоторых звуков тип сжатия PCM (на самом деле без сжатия) и тип загрузки Compressed in Memory. В этом случае Decompress on Load тоже подойдёт, я просто хотел показать, что не нужно выбирать Streaming.
  • Некоторые межплатформенные пакеты, например FMOD и Wwise имеют собственные способы обработки импорта звука, что делает параметры Unity излишними (только если вы по какой-то причине не заходите запускать некоторые звуки без этих пакетов).
  • В таблице рекомендуемых параметров есть категория «Шумовые эффекты» (Foley), который может вызвать споры, потому что это термин из кино, имеющий очень конкретное значение. Вероятно, его вообще не стоит использовать в играх. Однако я считаю, что это наиболее подходящий термин для разных звуков, связанных с физическими взаимодействиями между персонажами и объектами в игре.
  • Хотя у многих целевых платформ есть нативные частоты дискретизации (Sample Rate), Unity постоянно экспериментирует с микшированием и подборкой частот дискретизации. Это означает, что если звук воспроизводится не со скоростью 100%, или если звук импортирован с параметром Optimise Sample Rate, то консоли/устройству придётся выполнять интерполяцию собственной частоты дискретизации на лету, чтобы всё выводилось с нативной частотой дискретизации. Обычно это ничтожно малозатратная операция, даже на мобильных, но потенциально может вызывать проблемы на некоторых платформах.
Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть