回答:
ここでの答えは、制限がDouble
の仮数であることを理解していません。の完全に正確な最大値GameTime.TotalMilliseconds
は、実際には約10,000日です。
TimeSpan
の内部表現はでありTick
、1 / 10,000ミリ秒として定義されます。TotalMilliseconds
は、異なる仮数の値Double
のみを表すことができ2^53
ます。2 ^ 53ティック後、情報が失われます。
したがって、精度を失わずにTimeSpan
aとして表すことができる最大のものDouble
は次のとおりです。
2^53 ticks / 10000 ticksperms ≅ 900719925474 ms ≅ 10425 days
TotalMilliseconds
a double
ではなくaになるのlong
ですか?
long.MaxValue / TicksPerMillisecond
2 ^ 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
)、それを使用します。