Форма приложения WinForms «качает» при воспроизведении аудио - PullRequest
3 голосов
/ 24 марта 2010

У меня есть программа на C #, которую я разрабатываю. он использует образцы звука и winsock.

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

как мне отладить это или представить его вам в управляемой манере? Я уверен, что никто не захочет получить весь код приложения, опасаясь вирусных атак.

пожалуйста, ведите меня ..

РЕДАКТИРОВАТЬ: я не смог определить ни один раздел кода, который приводит к этому результату. это просто так, и я не могу это объяснить.

РЕДАКТИРОВАТЬ: нет, положение х / у не меняется. окно как будто встряхивает вокруг нескольких пикселей и затем возвращается в положение, в котором оно было до сотрясения.

if (audio)
{
    Stream stream;
    SoundPlayer player;

    stream = Properties.Resources.ResourceManager.GetStream("_home");
    player = new System.Media.SoundPlayer(stream);
    player.PlaySync();
    player.Dispose();

    string ShipID = fireResult.DestroyedShipType.ToString();
    stream = Properties.Resources.ResourceManager.GetStream("_" + ShipID);
    player = new System.Media.SoundPlayer(stream);
    player.PlaySync();
    player.Dispose();

    stream = Properties.Resources.ResourceManager.GetStream("_destroyed");
    player = new System.Media.SoundPlayer(stream);
    player.PlaySync();
    player.Dispose();
}

Вы видите что-нибудь в вышеприведенном коде, которое может привести к дрожанию?

РЕДАКТИРОВАТЬ: да, код выполняется внутри: this.Invoke (новое действие (делегат () {....})); это могло быть это? как мне решить это?

EDIT:

           stream = Properties.Resources.ResourceManager.GetStream("_destroyed");
           player = new System.Media.SoundPlayer(stream);
           player.PlaySync();
           player.Dispose();
           stream.Dispose();

если вынуть вышеприведенный код, то он отлично работает! есть идеи?

РЕДАКТИРОВАТЬ: я заменил строку с:

stream = Properties.Resources.ResourceManager.GetStream("_destroyed");

для другого имени файла, но проблема все еще существует, но, по крайней мере, это не аудиофайл поврежден.

РЕДАКТИРОВАТЬ: MSN, когда кто-то отправляет подтолкнуть? это немного похоже, но происходит только 2 или 3 раза.

EDIT: Вы используете сторонние библиотеки? - нет, я не использую какие-либо сторонние библиотеки.

РЕДАКТИРОВАТЬ: кажется, независимо от того, какой файл, 3-й пример всегда вызывает это.

РЕДАКТИРОВАТЬ: происходит везде, где я использую звуковые образцы. если я сыграю 3 сэмпла, ситуация произойдет.

РЕДАКТИРОВАТЬ: @nobugz: да, думаю, что вы правы. проблема в том, чтобы задержать поток пользовательского интерфейса слишком долго. как я пытался просто использовать объединенный аудио-файл, и проблема там, учитывая его первоначальную продолжительность.

РЕДАКТИРОВАТЬ: я решил эту проблему, поставив Application.DoEvents(); после каждой команды воспроизведения сэмпла. не трясет:)

РЕДАКТИРОВАТЬ: вышеупомянутое решение действительно не работает. по мере роста количества сэмплов игроков приложение снова зависло. вместо этого было использовано решение с использованием QueueUserWorkItem. это еще предстоит доказать как удовлетворительное решение, так как происходит перекрестная торговля, т. е. новая нота семплов может быть запущена, пока старая еще играет.

будет обновлять это по мере появления новых знаний.

Ответы [ 2 ]

4 голосов
/ 24 марта 2010

Вызов PlaySync в потоке пользовательского интерфейса не так хорош. Это заставит ваше главное окно перестать отвечать на запросы, так как ваш поток пользовательского интерфейса занят ожиданием завершения звука, он не доходит до прокачки сообщений, как это должно быть. Если это занимает достаточно много времени, Windows входит и перекрывает окно «призраком», как правило, он говорит «Не отвечает» в строке заголовка (если он есть). Это призрачное окно может не совсем соответствовать вашему собственному окну, что может объяснить «дрожание».

Использование Play () вместо этого решит эту проблему. Но получает новый, последовательность звуков становится трудным. Выполнение вызовов из потока может решить обе проблемы. Проверьте NAudio для лучшего контроля над звуком.

3 голосов
/ 24 марта 2010

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

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

Если вы найдете что-то, что, после удаления, исправит ошибку, есть две возможности: либо вы нашли ошибку, либо есть какая-то синергия с остальной частью программы, чтобы вызвать ошибку. В последнем случае продолжите удаление дополнительной программы.

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

Это одна из последних стратегий, которую я использую, когда сталкиваюсь с ошибкой, которую вообще не могу найти.

...