3

我的应用程序中有两个线程 - 主 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_WiimoteChanged 中时,才会发生这种情况。

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

旁注:这条线也是更高延迟的原因 - 在设置它之前完成的处理实际上很快!

4

3 回答 3

2

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

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

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

于 2010-02-22T05:41:58.150 回答
0

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

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

于 2010-02-22T07:04:01.867 回答
0

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

您的 FPS 实际上不应该ProcessFrame是每秒调用的次数吗?如果你测量它,你可能会得到更准确的结果。

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

于 2010-02-22T06:04:30.637 回答