アプリには 2 つのスレッドがあります。メインの UI スレッドと、wm_WiiMoteChanged イベント ハンドラー (バックグラウンド スレッド) によって開始される別のスレッドです。メインスレッドでは、いくつかのビデオ処理を行います。以下に示す関数がありprocessFrame
ます。そのコードを使用して、各フレームの処理時間を測定し、1 秒あたりのフレーム数を測定します。
行をコメント アウトする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);
補足:この行も遅延が大きくなる原因です。これを設定する前に行われた処理は、実際には高速です!