«

»

Май 31 2015

Работа над аудио-микшером движка завершена

Недавно была завершена работа над аудио-микшером движка SkyEngine2 (не путайте аудио-микшер с аудио-рендером). При разработке микшера ставились следующие задачи:

  • Все звуки и музыка должны иметь частоту дискретизации в 48KHz и разрядность в 16 бит
  • Микширование должно производиться в формате Float32
  • Возможность воспроизведения фоновой музыки с плавной сменой музыкальных тем
  • Отсутствие необходимости удерживать в оперативной памяти данные всего музыкального трека (chaining)
  • Возможность воспроизведения до 64-х стерео звуков с независимой задачей громкости для каждого из них
  • Минимизация затрат памяти, особенно оперативной, на хранение данных звуков и музыки
  • Возможность генерировать звуковые пакеты различной длинны (480, 800, 960, 1200, 1600, 1920 или 2400 звуковых отсчётов)

Исходя из требования по уменьшение затрат ОЗУ были реализованы два технических решения. Во-первых для экономии ОЗУ данные звуков и музыки решено было загружать в ОЗУ прямо в сжатом виде (на диске то почти все ресурсы хранятся в сжатом виде, но разжимаются ещё при загрузке в ОЗУ). Во-вторых все музыкальные треки при экспорте в набор ресурсов разбиваются на блоки по 30 секунд (загрузка следующего блока инициируется движком за 2 секунды до окончания текущего), что при используемом алгоритме сжатия приводит к размеру блока в 4-5 МБ.

Исходя из выше изложенного для сжатия аудио данных требовался алгоритм, позволяющий быстро разжимать их налету (в текущей реализации при разжатии аудио-данных даже не используется промежуточный буфер, а вместо этого микширование осуществляется сразу из XMM-регистра). В конечном было решено реализовывать сжатие без потерь. Сжатие аудио данных с помощью LZ77 и/или энтропийного кодирования сколь-либо позитивных результатов не дали (ну это было ожидаемо изначально) и в качестве основы для будущего аудио-формата был взят формат FLAC: разбиение звука на фрагменты, декорреляция каналов (только стерео), использование линейного предсказателя (есть вариант с более сложным алгоритмом), кодирование ошибки предсказателя с помощью энтропийного кодера (из-за особенностей распределения значений ошибки эффективным решением оказались коды Райса).

В результате для хранения звуков в движке был разработан формат SESS. Степень сжатия звуковых данных с его помощью достигает 70-50% (немного хуже FLAC`а, но при максимально сжатии в нём используется более сложный предсказатель от которого, по соображениям производительности, я решил отказаться). В конечном итоге требование по одновременному воспроизведению 64-х звуков было сильно перевыполнено – в идеальных условиях (нет необходимости пропуска аудио данных из-за отсутствия звуковых данных в ОЗУ на момент начала воспроизведения) микшер одновременно воспроизводит до 2000(!) звуков.

 

 

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