回答:
ここでの答えは、制限がDoubleの仮数であることを理解していません。の完全に正確な最大値GameTime.TotalMillisecondsは、実際には約10,000日です。
TimeSpanの内部表現はでありTick、1 / 10,000ミリ秒として定義されます。TotalMillisecondsは、異なる仮数の値Doubleのみを表すことができ2^53ます。2 ^ 53ティック後、情報が失われます。
したがって、精度を失わずにTimeSpanaとして表すことができる最大のものDoubleは次のとおりです。
2^53 ticks / 10000 ticksperms ≅ 900719925474 ms ≅ 10425 days
TotalMillisecondsa doubleではなくaになるのlongですか?
long.MaxValue / TicksPerMillisecond2 ^ 53より大きくなることはありません。TimeSpanは実際には内部的に何もdoubleとして追跡しません。
これはおかしな雑学ですが、完全な精度を気にしない場合(何世紀も話しているときに1秒以内に何をするか、1秒かかるかを気にする人)TotalTime、doubleと同様に、格納できる最大値は1.7976931348623157E+308です。
C#でオーバーフローがどのように機能するかはわかりませんが、これより長くゲームを実行すると、に戻るか-1.798*10^308、単に変化しないかのどちらかになると思います。また、内部での実装方法にも依存します。
とはいえ、そのミリ秒数はかなり大きいです。宇宙の仮説の時代と比較すると、それは...ええと...ええと、まだかなり大きいです。
もちろん、サムが言ったように、時間は実際にはティック(10分の1ナノ秒?)で保存されるため、「はるかに短い」期間の後に「制限」にぶつかることになります。それはまだグーゴルの立方体に宇宙の時代をかけたもののようなものです。
GameTime時間を正確にどのように格納するかはわかりません。つまり、TotalMilliseconds出力が最大値に「近づく」ことは実際にはない可能性もあります。けれども、値が十分に高いを取得し、あなたがゲッターを呼び出すときにだけ、その後、タイマーは最大値まで増加しますないティックいつでも、それは日と年に時間をパッケージだ場合はdouble 年間であり、さらに高いです。
なんらかの理由で、非常に多くのユニバースが生まれて完全に探索するのに時間がかかるようなゲームのコンテンツに豊富なコンテンツが必要な場合は、任意の数を格納するための特殊なデータ型が存在します。JavaのBigDecimalサイズは基本的にRAM(および仮想メモリ、さらにはハードディスク領域)によって制限されます。どうやら、C#にはありませんがBigDecimal、持っていBigIntegerます。
そのような壮大なスケールのゲームを作成する場合は、まさに神々自身によってプレイされることは間違いありませんが、おそらくBigDecimalクラスを複製してから、クラスを再実装してGameTime(または単に定期的ににGameTime値を追加してBigDecimal)、それを使用します。