2012-06-22 9 views
5
で過ごし

[[EDIT 2倍]私は私が私の元の質問が間違って文言たと思うので、私は以下のことをダウンscooted、私は将来の読者のために、で取得しようとしています正確に何を書き直しています。 ]トラッキング時間はデバッガ

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~
[新しい、輝いている、より良い言葉遣いでクリア質問]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~

私はシミュレーション/ゲームフレームワークのために実行されているループを持っています。現実に - - このループは、それがどのくらいの時間を確認する必要があり、その中にいくつかの場所を持っている具体的には、レンダリングおよび更新する - - 正常に動作することができ、これらの特別な場所内のロジックがなるように、合格しています。固定時間ステップ(unfixed[update/render]が偽)であるかどうかの選択肢があります。

問題は、ストップウォッチを使用してどのくらいリアルタイムが経過したかを把握するため、アプリケーションの任意のポイントでブレークポイントベースのデバッグが行われるときに発生します(実際の速度で移動する物理およびアニメーションの目的でどのくらいの数のフレームをコンピュータに書き出すことができるかに基づいて)。

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(); 

    } 
} 

それはその「一部」から経過した時間を知っている必要があるアプリケーションループの各「パート」のため複数のストップウォッチを使用して、このように(おおよそ)に見える最後を発生

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

updatestopwatchが更新()関数の外で過ごした時間のためのStopwatchで、

renderstopwatchレンダリング()関数の外に費やされた時間のためにStopwatchであり、そして

gamestopwatch

シミュレーション/ゲーム自体の総経過時間Stopwatchあります。私はどこかのアプリケーションでデバッグするとき

問題が発生します。ストップウォッチをリアルタイムに測定しているので、私はアプリケーションをデバッグしていたか否かストップウォッチは、時間のカウントを維持しますので、シミュレーションは完全にブレークポイントベースのデバッグのいずれかの種類ではオフにスローされます。私はパフォーマンスを測定するためにストップウォッチを使用していません:私はそれらを使用して、Update、Render、および上記のような他のイベントの再発生の間の時間を追跡します。私はレンダリング()時間はそう完全にシミュレーションの結果のいずれかの表示がvengefully顔を蹴られていることオフになって、その後ブレークポイントを設定して分析し、更新()でエラーを修正しますが、とき、これは非常にイライラ取得します。

私が完全にデバッグをやめるときは、明らかに問題ではありませんが、私は多くの開発作業が必要です。私は長い間デバッグしていますので、これは不都合ではないと思われます残念ながら、動作しません。 = [

私はパフォーマンスカウンターを見ましたが、私がやろうとしていることのコンテキストでそれらを動作させる方法について私の頭を包んでいるようには見えません。レンダーと更新には任意の量これらのループはループの個々のコンポーネントに対して確実に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(); 
} 

時対策を自体は罰金が、それは実際に本当の時間を測定する - 私はデバッグを過ごし任意の時間を含みます。つまり、私がupdatestopwatch.Reset()の後に17秒間たどり着くと、これは私のループの上に合成され、そのループの少なくとも1回は再実行されます - 私は私の計算のすべてをリアルタイムで費やした余分な時間に対処しなければなりません。

デバッガにアプリケーションをフリーズするタイミングを知らせる方法はありますか?時間を測定し、それに応じてそれを引きますか?タグ付けされているので、私は.NETとC#を使っていますが、Visual Studioに関連するものも私を正しい方向に向けるのに役立ちます。

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

+0

このパフォーマンスデータで何をしたいのですか?デバッガのオーバーヘッドは、StopwatchインスタンスにUI待機時間を単に追加するよりも、微妙な方法でパフォーマンス測定値を混乱させる可能性があります。このループを最適化しようとしている場合は、測定を行うときにデバッガを使用しない方がよいでしょう。 –

+0

Update()の後で、updatestopwatch.Reset()が呼び出される前にブレークポイントを設定することはできますか? – davenewza

+0

私は単なる更新ループ以上のものを持っています。レンダリングループやその他のイベントが捕捉されて使用されます。したがって、ブレークポイントを別の場所に置くことは、実際には解決策ではありません。 –

答えて

2

代わりにパフォーマンスカウンターを使用してください。プロセスのCPU時間は良いインジケータ(リアルタイムのストップウォッチほど正確ではない)を与えるべきであり、デバッグを妨げるべきではありません。

+0

私はパフォーマンスカウンタについて知りませんでした。私は彼らに試してみると戻ってきて、ティがうまくいくなら答えをマークします。ご協力ありがとうございました。 –

+0

@ ThePhD:もう一つの利点は、システムの残りの部分が負荷を受けていても、実際のCPU時間を得ることです。これらのケースではリアルタイムはあまり意味がありません:) – leppie

+1

@ThePhD:ここにいくつかのサンプルコードがあります:https://github.com/leppie/IronScheme/blob/master/IronScheme/IronScheme/Runtime/Builtins.cs#L519 – leppie

0

Debug.WriteLine()を使用してローカルに(デバッグしようとしているどのようなデータでも)出力することができます。

+0

これは、私がブレークポインティングをしているかどうかにかかわらず、行うのが良いことです。私はそれをやります。私は、Update(またはRenderやMainループの他のコンポーネント)のようなものを計算に費やす時間を知ることができ、余分なデバッグ時間をかけずに済むことができればいいだけです。 –

関連する問題