WinForms 应用程序窗体在音频播放时“抖动”

iTE*_*Egg 3 c# shake winforms

我有一个正在开发的 C# 游戏程序。它使用声音样本和 winsock。

当我测试运行游戏时,大部分音频都可以正常工作,但有时如果它是按顺序播放多个样本,则应用程序表格会稍微晃动一下,然后又回到原来的位置。

我如何调试这个或以可管理的方式向你们展示它?我相信没有人会因为害怕病毒攻击而想要整个应用程序代码。

请指导我..

编辑:我无法确定产生此结果的任何代码部分。它就是这样,我无法解释。

编辑:没有 x/y 位置没有改变。窗口像晃动几个像素,然后回到晃动之前的位置。

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();
}
Run Code Online (Sandbox Code Playgroud)

你能在上面的代码中看到任何会产生这种震动的东西吗?

编辑:是的,代码正在执行: this.Invoke(new Action(delegate(){ ....})); 这会是吗?我该如何解决这个问题?

编辑:

           stream = Properties.Resources.ResourceManager.GetStream("_destroyed");
           player = new System.Media.SoundPlayer(stream);
           player.PlaySync();
           player.Dispose();
           stream.Dispose();
Run Code Online (Sandbox Code Playgroud)

如果取出上面的代码,那么它工作正常!有任何想法吗?

编辑:我用以下内容替换了该行:

stream = Properties.Resources.ResourceManager.GetStream("_destroyed");
Run Code Online (Sandbox Code Playgroud)

到不同的文件名,但问题仍然存在,但至少不是音频文件已损坏。

编辑:MSN 当有人发送微调时?有点像,但只发生 2 或 3 次。

编辑:您是否使用任何 3rd 方库?- 不,我没有使用任何 3rd 方库。

编辑:似乎无论是什么文件,第三个样本总是会导致这种情况。

编辑:在我使用声音样本的任何地方都会发生。如果我播放 3 个样本,就会发生这种情况。

编辑:@nobugz:是的,认为你是对的。问题是让 UI 线程阻塞太久。因为我试过只使用合并的音频文件,问题在于它的原始持续时间。

编辑:我通过Application.DoEvents();在每个示例播放命令之后放置来解决这个问题。没有震动:)

编辑:上述解决方案并没有真正奏效。随着播放器样本数量的增加,应用程序 GUI 再次卡住。已采用使用 QueueUserWorkItem 的解决方案。这仍然有待证明是一个令人满意的解决方案,因为交叉治疗发生,即可以在旧的样本仍在播放的同时启动新的样本线程。

随着更多知识的曝光,将对此进行更新。

Han*_*ant 5

在 UI 线程上调用 PlaySync 并不是那么好。它会使您的主窗口无响应,因为您的 UI 线程正忙于等待声音结束,它不会像它应该做的那样抽出消息。如果这需要足够长的时间,Windows 会介入并用“幽灵”覆盖窗口,它通常会在标题栏中显示“无响应”(如果有的话)。这个幽灵窗口可能与您自己的窗口不太匹配,这可以解释“抖动”。

改用 Play() 将解决该问题。但是给你一个新的,对声音进行排序变得困难。从线程调用可以解决这两个问题。查看NAudio以更好地控制声音。