O tempo de jogo deve sempre aumentar e o total de milissegundos será o maior valor. Portanto, se o jogo for hipoteticamente executado por 1 dia, esse valor deverá 86 400 000.
Provavelmente, isso não é um problema para a maioria dos jogos, mas estou curioso para saber se existe algum tipo de mecanismo à prova de falhas, se ele for muito grande ou se houver um limite.
Respostas:
Receio que as respostas aqui não entendam que o limite é a
Double
mantissa. O valor máximo totalmente exatoGameTime.TotalMilliseconds
é de aproximadamente 10.000 dias .TimeSpan
A representação interna deTick
é definida como 1 / 10.000 milissegundos .TotalMilliseconds
é aDouble
, que pode representar apenas2^53
valores diferentes de mantissa . Após 2 ^ 53 ticks, há perda de informações.Portanto, o maior
TimeSpan
que pode ser representado como umDouble
sem perda de precisão é:fonte
TotalMilliseconds
seria umdouble
e não umlong
?long.MaxValue / TicksPerMillisecond
nunca será maior que 2 ^ 53. O TimeSpan, na verdade, não controla nada como um duplo internamente.Isso é um pouco mais trivial, mas se você não se importa com a precisão perfeita (quem se importa se você dá um segundo ou fala um pouco ao falar de séculos?), Então, como
TotalTime
é um duplo, o valor máximo que ele pode armazenar é1.7976931348623157E+308
.Não tenho certeza de como os estouros funcionam em C #, mas se você executar o jogo por mais tempo, acho que ele voltaria a algo como
-1.798*10^308
ou simplesmente não mudaria. Também depende de como é implementado internamente.Dito isto, esse número de milissegundos é bastante grande. Se você comparar com a idade hipotética do universo, é ... Bem ... ainda é bem grande .
É claro que, como Sam disse, o tempo é realmente armazenado em ticks (décimos de nanossegundo?), Portanto, você entraria no "limite" após um período de tempo " muito mais curto ". Ainda é algo como um cubo de um googol vezes a idade do universo.
Não sei
GameTime
exatamente como armazena o tempo, exatamente, portanto, isso também significa que você nunca verá aTotalMilliseconds
saída "aproximar-se" do seu valor máximo. Embora, se for tempo de empacotamento em dias e anos sempre que o valor dos ticks for alto o suficiente, e não apenas quando você chamar o getter, o cronômetro aumentará até o valor máximo dedouble
anos , o que é ainda mais alto .Se, por alguma razão, seu jogo tiver conteúdo tão abundante que exija um período de tempo em que muitos universos nascem e perecem para explorar completamente, existem tipos de dados especializados para armazenar números arbitrariamente grandes. Java tem um
BigDecimal
tamanho cujo basicamente é limitado pela sua RAM (e através da memória virtual, até do espaço no disco rígido). Aparentemente, o C # não possuiBigDecimal
, mas possuiBigInteger
.Se você fizer um jogo em escala épica, sem dúvida para ser jogado pelos próprios deuses, você provavelmente começará duplicando a
BigDecimal
classe e, em seguida, reimplementando aGameTime
classe (ou apenas adicionando periodicamenteGameTime
o valor de suaBigDecimal
) para usá-la.fonte