Gametime.TotalMillisecondsに制限はありますか?


8

ゲーム時間は常に増加している必要があり、合計ミリ秒が最大値になります。したがって、仮にゲームを1日間実行した場合、この値は86 400 000になります。

これはほとんどのゲームではおそらく問題ではありませんが、大きくなりすぎた場合、または制限が存在する場合でも、何らかのフェイルセーフメカニズムがあるかどうか知りたいです。


誰がそれをテストしたいですか!:D
SpartanDonut

回答:


6

ここでの答えは、制限がDoubleの仮数であることを理解していません。の完全に正確な最大値GameTime.TotalMillisecondsは、実際には約10,000日です。

TimeSpanの内部表現はでありTick1 / 10,000ミリ秒として定義されますTotalMillisecondsは、異なる仮数の値Doubleのみを表すことができ2^53ます。2 ^ 53ティック後、情報が失われます。

したがって、精度を失わずにTimeSpanaとして表すことができる最大のものDoubleは次のとおりです。

2^53 ticks / 10000 ticksperms  900719925474 ms  10425 days

1
私はこの答えに同意しませ。ティックの数は、符号付き64ビット整数です。ミリ秒数は2倍として公開されますが、2 ^ 63ティックのミリ秒数は2 ^ 53未満であるため、精度の浮動小数点損失はありません。
ジミー

1
@ジミー:あなたが同意しないことを残念に思います。しかし、精度を失うことなく53ビットの仮数に63ビットを格納することはできません。これは事実です。そしてゲームでは、そのミリ秒未満の精度が必要です。そうでなければ、なぜTotalMillisecondsa doubleではなくaになるのlongですか?
sam hocevar

1
63ビットが53ビットの仮数に格納されることはありません!これが私の疑似TimeSpanです。これは、実際の動作にかなり近いものです:gist.github.com/1753547long.MaxValue / TicksPerMillisecond2 ^ 53より大きくなることはありません。TimeSpanは実際には内部的に何もdoubleとして追跡しません。
ジミー

@ジミー:あなたが理解していない何かがありますが、私はそれが何であるかわかりません。ideone.com/1XLuJをチェックして、クラスが60ビットの目盛り値で精度を失う方法を確認してください。
sam hocevar

それは理にかなっている。ミリ秒の整数値を想定していました。自分の答えを削除しました。
ジミー

-1

これはおかしな雑学ですが、完全な精度を気にしない場合(何世紀も話しているときに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)、それを使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.