2

私は XNA ゲームを作成しています。日中のシステムを作成する時が来ました。そのためには、ある種の時計が必要です。カスタム クロック クラスの秒カウンターに 1 秒追加するために使用しようとしましGameTime.TotalGameTime.Milliseconds == 0たが、GameTime が常に 0 ミリ秒を経過するとは限らないことがわかりました。を使用TimeSpan prevUpdateして比較しTotalGameTime.TotalSecondsても十分な精度が得られず、時間は何らかの理由で実際の時間よりも著しく遅くなります。

リソースのコストがかかりすぎたり、リアルタイムから著しく逸脱したりしないように、クロックの基準としてどの XNA または .Net コンポーネントを使用できますか?

4

1 に答える 1

3

Stopwatch高精度のタイミングに使用します (参考)。

GameTimeレンダリングとフレーム間のタイミング ロジックにはXNA を使用します。XNA のタイマーは、「壁時計」の時間と正確に一致しません。フレーム レンダリングとの整合性を高めるためにドリフトすることができ、よりスムーズなアニメーションが得られます (これはGameクラスによって提供される動作です)。時間の経過とともに、リアルタイムからわずかにずれますが、ほとんどのゲームではこれは問題になりません。

DateTimeより長い時間スパンを正確に測定するために使用します (例: 分、時間)。


XNA がいつメソッドMilliseconds == 0を呼び出すかを正確に知ることができないため、を比較するべきではないことに注意してください。そのため、1 つのフレームで、次に次のフレームでラップアラウンドして 0 を超えてスキップすることができるため、条件がトリガーされることはありません。UpdateMilliseconds == 999Milliseconds == 15

そのため、タイマーがいつしきい値を超えるかを判断する必要があります。これを行うには多くの方法があります。しきい値を追跡して (「合計」時間を追跡する場合に便利です)、各トリガーの後に増分することができます。個人的には、次のように時間を蓄積することを好みます。

seconds += gameTime.ElapsedTime.TotalSeconds;
if(seconds > 1.0)
{
    seconds -= 1.0;
    DoSomething(); // Triggered each second
}
于 2012-10-30T15:16:31.600 に答える