Надеюсь написал в подходящий раздел. Я тут решил для разнообразия попробовать сделать в игре генератор музыки. При чем игра должна идти на мобильных. Но что-то, чем больше работаю над скриптом, тем хуже всё становится. Во 1х - даже на прошлогоднем топовом телефоне музыка идёт медленно, а на поза-позапрошлогоднем ещё и с запинками. Во 2х бывают щелчки.
А я ведь не программирую целый оркестр. Я взял для начала 3 инструмента. Сэмплы взял wav из бесплатных sfz банков. 4-6 сэмплов на октаву. То есть, например, есть сэмпл ноты "до", а если надо взять ноту "до #", то тот же сэмпл играется с повышенным питчем. У каждого инструмента есть параметр полифония, то есть сколько нот может звучать одновременно. И при старте приложения создаётся объект с AudioSource'ми, количество которых равно общей полифонии плюс несколько запасных. И вот сейчас их где-то 12, не так уж много. Ещё создаётся список этих компонентов, как бы пул. И по ходу игры каждый инструмент берёт из этого пула AudioSource, грузит в него свой сэмпл, присваивает параметры громкости и питча, а когда нота перестаёт звучать, то AudioSource возвращается в пул. Что я делаю не так?
А ну да, у скрипта есть публичная переменная BPM - количество ударов метронома в минуту, грубо говоря. Пробовал синхронизировать через Time.unscaledTime и AudioSettings.dspTime. Одно не лучше другого.
И основные вычисления конечно выполняются не каждый фрейм, а только во время условного "удара метронома", кроме корутин, отвечающих за трели, тремоло, и за плавное затухание ноты. Это чтобы избежать щелчков. Я знаю, что в юнити предусмотрена фича AudioSource.SetScheduledEndTime для избежания щелчков, но как-то она не помогает.