C# NET中方法和线程的计时

C# NET中方法和线程的计时,c#,multithreading,timing,frame-rate,C#,Multithreading,Timing,Frame Rate,我的应用程序中有两个线程-主UI线程和另一个由wm_WiiMoteChanged事件处理程序(后台线程)启动的线程。在主线程中,我做了一些视频处理。我有一个名为processFrame的函数,如下所示。我使用该代码来测量处理每个帧的时间,从而测量每秒帧数 如果我注释掉wm.WiiMoteChanged…行(见下文),帧速率约为15-20 fps,看视频,这似乎是正确的(有一个小的延迟) 但是当我取消注释该行时,即添加事件处理程序(它将自己生成一个线程),fps将上升到40-50,但这肯定是错误的

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

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

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

有人能解释一下为什么会这样吗?谢谢

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_中时,才会发生这种情况

ibxOutput.Image=新图像(\u irViewAreaBitmap)

旁注:这一行也是更高滞后的原因-设置之前的处理实际上很快

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

处理程序是否包含锁定?建议您发布
wm\u WiimoteChanged()


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

好吧,我这里有点粗,但我不明白每秒帧数的计算

您的FPS是否应该不是一秒钟内调用
ProcessFrame
的次数?如果你测量一下,你可能会得到更准确的结果


另外,为了测量时间,最好使用秒表;它就是为了这个目的而构建的。

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


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

他问为什么他报告的FPS会上升,即使每帧花费的时间更长……谢谢提示。我用秒表得到了类似的结果。添加了事件处理程序后,FPS会更高(特别是在事件处理程序中设置图像框的image属性)。您的意思是如果我注释掉
wm.WiiMoteChanged
。。。。因为不注释和取消注释听起来是一样的…??你能粘贴你的
wm\u WiimoteChanged
方法的代码吗?@dboarman:哈哈,修正了“不注释”到“注释”的问题。Thanks@Neil例如我想我能做到。我发现这要容易得多,1000毫秒除以毫秒处理一个帧=一秒钟内可以处理的帧数。关于秒表,我试过了,得到了类似的结果:(