在.NET中定时方法和线程

时间:2010-02-22 05:36:06

标签: c# multithreading timing frame-rate

我的应用程序中有两个线程 - 主UI线程和由wm_WiiMoteChanged事件处理程序(后台线程)启动的另一个线程。在主线程中我做了一些视频处理。我有一个名为processFrame的函数,如下所示。我使用该代码来测量处理每个帧的时间,从而测量每秒帧的速率。

如果我注释掉wm.WiiMoteChanged ...行(见下文),帧速率约为15-20 fps并且正在观看视频,这似乎是正确的(有一个小的延迟)。

但是当我取消注释该行时,即添加事件处理程序(它将自己生成一个线程),fps上升到40-50,但这绝对是错误的 - 视频实际上更加滞后。 / p>

有人可以向我解释为什么会这样吗?感谢。

private void Main_Load(object sender, EventArgs e)
{
    try
    {
        wm.Connect();
        //wm.WiimoteChanged += wm_WiimoteChanged; 

        wm.SetReportType(InputReport.IRAccel, true);
        wm.SetLEDs(false, false, false, true);
    }
    catch (Exception x)
    {
        MessageBox.Show("Exception: " + x.Message);
        this.Close();
    }
}

更多代码:

private void processFrame(object sender, EventArgs e)
{
    DateTime curr = DateTime.Now;
    performOperation();
    TimeSpan currTime = DateTime.Now - curr;
    lblFPS.Text = (1000 / currTime.Milliseconds).ToString() + " fps";
}

修改

一个有趣的发现,只有在wm_WiimoteChanged中存在这一行时才会发生这种情况。

ibxOutput.Image = new Image<Bgr, Byte>(_irViewAreaBitmap);

旁注:此行也是滞后更高的原因 - 在设置此项之前完成的处理实际上很快!

3 个答案:

答案 0 :(得分:2)

因为通过添加事件处理程序,您将响应这些WiimoteChanged事件并运行额外的代码。

处理程序是否包含锁定?建议您发布wm_WiimoteChanged()

的代码

更新:建议您使用System.Diagnostics.Stopwatch而非DateTime.Now DateTime.Now可能不够准确。

答案 1 :(得分:0)

好的,我在这里很厚,但我不明白每秒帧数的计算?

你的FPS实际上不应该是在一秒钟内调用ProcessFrame的次数吗?如果你衡量一下,你可能会得到更准确的结果。

另外,为了衡量时间,最好使用StopWatch;它是为此而建的。

答案 2 :(得分:0)

每次调用processFrame方法时,是否只有一帧被渲染到屏幕上?我怀疑渲染是在其他地方发生的,并被WiimoteChanged处理程序中的代码阻止,为您的processFrame方法提供了更多的处理器时间。

为了使您的FPS测量准确,您需要确保每帧只调用一次processFrame。您应该测量后续调用之间的时间,而不是测量performOperation的持续时间,除非processFrame在返回时再次立即调用。