我的应用程序中有两个线程 - 主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);
旁注:此行也是滞后更高的原因 - 在设置此项之前完成的处理实际上很快!
答案 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
在返回时再次立即调用。