Я пытаюсь добавить визуализатор в качестве фона для своей игры, которую я создаю с помощью MonoGame для графики и ввода и NAudio для музыки. MonoGame не имеет визуализации, но я читал, что вы можете сделать это с помощью NAudio. Проблема в том, что, похоже, данные не обновляются регулярно, как должно быть.
Я скопировал SampleAggregator из AudioPlaybackDemo в WPFDemo и реализовал его с помощью функций событий и всего остального. Это выглядит хорошо, за исключением того, что, кажется, он обновляется только около 5 раз в секунду, в то время как остальная часть моей игры работает на скорости 60 кадров в секунду. Здесь - это видео, показывающее его.
Добавлено к событию FFTCalculated SampleAggregator:
private void SampleAggregator_FftCalculated(object sender, FftEventArgs e)
{
if (done)
{
done = false;
visQueue = (Complex[])e.Result.Clone();
}
}
А для рисования делаю:
private void DrawVisualizer()
{
spriteBatch.Begin();
int count = visQueue.Length;
for(int i = 0; i < visQueue.Length; i++)
{
int height = (int)((visQueue[i].Y + 1) * 25);
spriteBatch.Draw(pix, new Rectangle((int)(GraphicsDevice.Viewport.Width * ((float)i / (float)count)), GraphicsDevice.Viewport.Height - height, GraphicsDevice.Viewport.Width / count, height), uiColor * 0.5f);
}
spriteBatch.End();
done = true;
}
Переменная done
только для того, чтобы убедиться, что список не меняется во время отрисовки. Когда я проверяю время, он говорит, что обновляет каждый кадр. Кроме того, мне нужно было проверить, не отличается ли массив между вызовами SampleAggregator_FftCalculated()
, и у него было несколько сообщений об одном и том же.
Я бы ожидал, что он будет работать на скорости 60 кадров в секунду, но это не так. Есть идеи, почему это так?
Спасибо!