5

[[EDIT 2x]元の質問の言い回しが間違っていると思うので、下にすくって、将来の読者のために、私が得ようとしていることを正確に書き直しました。]

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[新しい、光沢のある、明確な質問とより良い言葉遣い]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~

シミュレーション/ゲームフレームワークで実行されているループがあります。このループには、実際にはどのくらいの時間が経過したかを確認する必要がある場所がいくつかあります。これにより、これらの特別な場所(具体的には、レンダリングと更新)内のロジックが正しく機能できるようになります。固定時間ステップ(unfixed[update/render]false)にするかどうかを選択できます。

この問題は、ブレークポイントベースのデバッグがアプリケーションの任意のポイントで実行されるときに発生します。これは、ストップウォッチを使用して、リアルタイムがどれだけ経過したかを把握するためです(物理学とアニメーションが現実的な速度で移動するためであり、その数に基づくものではありません)。コンピュータが解約できるフレーム)。

これは(大まかに)このように見えます。アプリケーションループの「部分」ごとに複数のストップウォッチを使用して、その「部分」が最後に発生してからどれだけの時間が経過したかを知る必要があります

while ( RunningTheSimulation ) {
    /* ... Events and other fun awesome stuff */

    TimeSpan updatedifference = new TimeSpan( updatestopwatch.ElapsedTicks );

    if ( unfixedupdate || updatedifference > updateinterval ) {

        Time = new GameTime( updatedifference,
                                    new TimeSpan( gamestopwatch.ElapsedTicks ) );
        Update( Time );
        ++updatecount;
        updatestopwatch.Reset( );
        updatestopwatch.Start( );
    }

    TimeSpan renderdifference = new TimeSpan( renderstopwatch.ElapsedTicks );

    if ( unfixedrender || renderdifference > renderinterval ) {

        Time = new GameTime( renderdifference,
                                 new TimeSpan( gamestopwatch.ElapsedTicks ) );
        Render( Time );
        ++rendercount;
        renderstopwatch.Reset( );
        renderstopwatch.Start( );

    }
}   

変数に関するいくつかの情報:

updatestopwatchUpdate()関数の外部で費やされた時間のストップウォッチです。

renderstopwatchRender()関数の外部で費やされた時間のストップウォッチであり

gamestopwatchシミュレーション/ゲーム自体の合計経過時間の ストップウォッチです。

アプリケーションのどこかでデバッグすると、問題が発生します。ストップウォッチはリアルタイムで測定しているため、アプリケーションをデバッグしているかどうかに関係なく、ストップウォッチは時間をカウントし続けるため、あらゆる種類のブレークポイントベースのデバッグによってシミュレーションが完全に破棄されます。パフォーマンスを測定するためにストップウォッチを使用していません。ストップウォッチを使用して、更新、レンダリング、および上記のような他のイベントの再発間の時間を追跡しています。これは、Update()でブレークポイントを設定し、エラーを分析して修正すると非常にイライラしますが、Render()の時間が完全にずれているため、シミュレーション結果の表示が非常に困難になります。

とはいえ、デバッグを完全にやめても問題はないのは明らかですが、開発作業がたくさんあり、長時間デバッグするので、不便ではないふりをするだけではうまくいきません。 、 不幸にも。= [

パフォーマンスカウンターを見ましたが、私がやろうとしていることのコンテキストでそれらを機能させる方法に頭を悩ませているようには見えません。レンダリングと更新には、任意の量のコードを含めることができます(これらは特定のものです)。このループの上で実行されているシミュレーションに対して)、つまり、ループの個々のコンポーネントに対してwhile着実に実行することはできません。PerformanceCounter.Increment()

System.Diagnosticsやその他の.NET名前空間をいじくり回し続けますが、これまでのところ、接続されたデバッガーで費やされた時間を単に「無視」する方法については空白になっています...

誰かアイデアや洞察がありますか?

[[EDITS 5x]スペルミスを修正し、すべてのフォーマットが正しいことを確認しました。申し訳ありません。]

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[元の、あまり明確でない質問]
~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~

C#アプリケーションで一定のループを実行していますが、これは常にデバッグしています。私は現在ストップウォッチを使用していますが、他のメカニズムを使用して経過時間を追跡することができます。私の問題は、このループのどこかでブレークポイントを使用するようなことをしたときに始まります(典型的な:に囲まれていますwhile (true) { ... }

if ( unfixedupdate || updatedifference > updateinterval ) 
{
    Time = new GameTime( updatedifference, 
                        new TimeSpan( gamestopwatch.ElapsedTicks ) );
    Update( Time );
    ++updatecount;
    updatestopwatch.Reset( );
    updatestopwatch.Start( );
}

時間はそれ自体は問題なく測定されますが、実際のリアルタイムを測定します-デバッグに費やした時間を含みます。つまり、17秒後に突っついているとupdatestopwatch.Reset()、これがループに組み込まれ、そのループを少なくとも1回再実行すると、すべての計算を考慮してリアルタイムで費やした余分な時間を処理する必要があります。

デバッガーに接続して、アプリケーションがフリーズするタイミングを知る方法はありますか?それで、時間を逆算し、それに応じて差し引くことができますか?タグ付けされているように、私はこれに.NETとC#を使用していますが、Visual Studioに関連するものはすべて、正しい方向に進むのに役立つ可能性があります。

[編集]より多くの情報を提供するために、私はいくつかのストップウォッチを使用しています(更新、レンダリング、および他のいくつかのイベントはすべて異なるメッセージキューにあります)。Update()内、またはアプリケーションの他の部分でブレークポイントを設定すると、ストップウォッチはこれらの間に費やされたリアルタイムを正確に測定します。Update()これには、orRender()などのダウンストリームと呼ばれるアプリケーションのさまざまな完全に無関係なコンポーネントのデバッグに費やす時間が含まれますInput()。明らかに、シミュレーションのタイミング(トップレベルのUpdate、Renderなどの関数に渡されるGameTimeパラメーターによって制御される)は、次の場合に正しく機能しません。 、CPUが更新機能を完了するのに13ミリ秒しかかからなかったとしても、デバッグに13秒余分に費やします(変数を見て、シミュレーションを続行します); 問題は、他のストップウォッチが突然13秒の余分な時間を占めるのを見るということです。それでも意味がわからない場合は、もう一度チャイムを鳴らします。

4

3 に答える 3

2

代わりにパフォーマンスカウンターを使用してください。プロセスのCPU時間は、適切な指標を提供する必要があり(ただし、リアルタイムのストップウォッチほど正確ではありません)、デバッグを妨げることはありません。

于 2012-06-22T12:11:51.933 に答える
0

これに対する可能な解決策は、Debug.WriteLine()を使用して、ローカル(またはデバッグしようとしているデータ)を出力に書き込むことです。

于 2012-06-22T12:10:12.337 に答える
0

実際にデバッグしようとしていることと、アニメーションタイマーが経過時間に対して期待されることを正確に実行することが問題である理由を説明できませんでした。あなたが休憩するとき、時間が続くことを知ってください。実際の問題は何ですか?

また、最適化をオンにしてリリースで実行している場合、デバッグ中のタイミングが測定値に近づくことはないことに注意してください。フレームごとの時間を測定する場合は、市販のプロファイリングツールを使用してください。メソッドまたは関数にかかった時間を見つけることは、まさにそれらが意図されたものです。

アニメーションが正しく機能するかどうかをデバッグする場合は、依存性注入と時間プロバイダーインターフェイスを使用して、壁掛け時計に依存するのではなく、時間を指定する決定論的テストを作成します。

この記事には素晴らしい例があります: https ://www.toptal.com/qa/how-to-write-testable-code-and-why-it-matters

于 2018-07-10T15:20:18.500 に答える