3

アプリには 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);

補足:この行も遅延が大きくなる原因です。これを設定する前に行われた処理は、実際には高速です!

4

3 に答える 3

2

イベント ハンドラーを追加することで、これらのWiimoteChanged イベントに応答し、追加のコードを実行するためです。

ハンドラーにロックが含まれていますか? コードを投稿することをお勧めしますwm_WiimoteChanged()

更新:System.Diagnostics.Stopwatchではなく使用することをお勧めしますDateTime.NowDateTime.Now は十分に正確ではない可能性があります。

于 2010-02-22T05:41:58.150 に答える
0

processFrameメソッドの呼び出しごとに、正確に 1 つのフレームが画面にレンダリングされますか? レンダリングが別の場所で行われており、WiimoteChangedハンドラー内のコードによってブロックされているため、processFrameメソッドのプロセッサ時間が増えていると思われます。

processFrameFPS 測定を正確に行うには、がフレームごとに 1 回だけ呼び出されるようにする必要があります。が返されたときにすぐに再度呼び出される場合をperformOperation除き、 の期間を測定するのではなく、おそらく後続の呼び出し間の時間を測定する必要があります。processFrame

于 2010-02-22T07:04:01.867 に答える
0

さて、私はここで太っていますが、1 秒あたりのフレーム数の計算がわかりませんか?

ProcessFrameFPS は、実際には 1 秒間に呼び出される回数ではないでしょうか? それを測定すると、より正確な結果が得られる場合があります。

また、時間を測定するには、StopWatch;を使用することをお勧めします。この目的のために構築されています。

于 2010-02-22T06:04:30.637 に答える