Die Spielzeit sollte immer länger werden, und die Gesamtmillisekunde wird der größte Wert sein. Wenn das Spiel also hypothetisch 1 Tag lang ausgeführt wird, sollte dieser Wert 86 400 000 betragen.
Dies ist wahrscheinlich kein Problem für die meisten Spiele, aber ich bin gespannt, ob es einen ausfallsicheren Mechanismus gibt, wenn er zu groß wird oder ob es überhaupt ein Limit gibt.
Antworten:
Ich fürchte, die Antworten hier verstehen nicht, dass die Grenze die
Double
Mantisse ist. Der maximale vollständig genaue Wert fürGameTime.TotalMilliseconds
beträgt tatsächlich ungefähr 10.000 Tage .TimeSpan
Die interne Darstellung ist dieTick
, die als 1 / 10.000 Millisekunden definiert ist .TotalMilliseconds
ist aDouble
, das nur2^53
unterschiedliche Mantissenwerte darstellen kann . Nach 2 ^ 53 Ticks geht die Information verloren.Das größte
TimeSpan
, dasDouble
ohne Genauigkeitsverlust dargestellt werden kann, ist:quelle
TotalMilliseconds
eindouble
und nicht ein seinlong
?long.MaxValue / TicksPerMillisecond
wird niemals größer als 2 ^ 53 sein. TimeSpan verfolgt intern nichts als Double.Dies ist eher eine dumme Kleinigkeit, aber wenn Sie sich nicht für perfekte Präzision interessieren (wen interessiert es, wenn Sie eine Sekunde geben oder nehmen, wenn Sie über Jahrhunderte sprechen?), Dann
TotalTime
ist das auch ein Doppelgänger maximalen Wert , den es speichern ist1.7976931348623157E+308
.Ich bin mir nicht sicher, wie Überläufe in C # funktionieren, aber wenn Sie das Spiel länger laufen lassen, würde es wahrscheinlich entweder auf so etwas zurückgehen
-1.798*10^308
oder sich einfach nicht ändern. Es hängt auch davon ab, wie es intern implementiert wird.Trotzdem ist diese Anzahl von Millisekunden ziemlich groß. Wenn man es mit dem hypothetischen Zeitalter des Universums vergleicht, ist es ... Äh ... Nun, es ist immer noch so ziemlich groß .
Natürlich, wie Sam sagte, wird die Zeit tatsächlich in Zecken gespeichert (Zehntel einer Nanosekunde?), So dass Sie nach einer " viel kürzeren " an die "Grenze" stoßen würden " Zeitspanne an . Es ist immer noch so etwas wie ein Würfel eines Googols, mal das Zeitalter des Universums.
Ich bin mir nicht sicher, wie
GameTime
genau die Zeit gespeichert wird. Dies bedeutet auch, dass dieTotalMilliseconds
Ausgabe möglicherweise nie "nahe" an ihren Maximalwert kommt. Wenn die Verpackungszeit in Tage und Jahre ist, wenn der Tick-Wert hoch genug wird, und nicht nur, wenn Sie den Getter anrufen, erhöht sich der Timer bis zum Maximalwert vondouble
in Jahren , der sogar noch höher ist .Wenn Ihr Spiel aus irgendeinem Grund so reichlich Inhalt haben sollte, dass Zeiträume erforderlich sind, in denen sehr viele Universen geboren werden und zugrunde gehen, um sie vollständig zu erforschen, gibt es spezielle Datentypen zum Speichern beliebig großer Zahlen. Java hat eine,
BigDecimal
deren Größe im Wesentlichen durch Ihren RAM (und durch den virtuellen Speicher, sogar Festplattenspeicher) begrenzt ist. Anscheinend hat C # nichtBigDecimal
, aber es hatBigInteger
.Wenn Sie solch ein episch skaliertes Spiel machen, das zweifellos von den Göttern selbst gespielt werden soll, würden Sie wahrscheinlich zuerst die
BigDecimal
Klasse duplizieren und dann dieGameTime
Klasse neu implementieren (oder sogar nur regelmäßigGameTime
den Wert Ihrer Klasse hinzufügenBigDecimal
), um sie zu verwenden.quelle