Có giới hạn cho Gametime.TotalMilliseconds không?


8

Thời gian chơi trò chơi phải luôn luôn tăng và tổng số giây sẽ là giá trị lớn nhất. Vì vậy, nếu trò chơi được chạy theo giả thuyết trong 1 ngày, giá trị này sẽ là 86 400 000.

Đây có lẽ không phải là vấn đề đối với hầu hết các trò chơi, nhưng tôi tò mò liệu có một cơ chế an toàn nào đó không thành công nếu nó quá lớn hoặc nếu một giới hạn thậm chí còn tồn tại.


Ai muốn thử nó! : D
SpartanDovy

Câu trả lời:


6

Tôi sợ câu trả lời ở đây không hiểu rằng giới hạn là câu thần chú Double. Giá trị hoàn toàn chính xác tối đa trong GameTime.TotalMillisecondskhoảng 10.000 ngày .

TimeSpanĐại diện bên trong của nó là Tick, được định nghĩa là 1 / 10.000 mili giây . TotalMillisecondslà một Double, chỉ có thể đại diện cho 2^53các giá trị mantissa khác nhau . Sau 2 ^ 53 tick, mất thông tin.

Vì vậy, lớn nhất TimeSpancó thể được biểu diễn là Doublekhông mất độ chính xác là:

2^53 ticks / 10000 ticksperms  900719925474 ms  10425 days

1
Tôi không đồng ý với câu trả lời này. Số lượng đánh dấu là một số nguyên 64 bit đã ký. Số mili giây được hiển thị là gấp đôi, nhưng số mili giây trong 2 ^ 63 tick là ít hơn 2 ^ 53, do đó không có mất điểm chính xác.
Jimmy

1
@Jimmy: Tôi xin lỗi vì bạn không đồng ý. Nhưng bạn không thể lưu trữ 63 bit trong một mantissa 53 bit mà không làm mất độ chính xác, đó là một thực tế. Và trong một trò chơi, bạn cần độ chính xác dưới một phần nghìn giây. Nếu không, tại sao sẽ TotalMillisecondslà một doublevà không phải là một long?
sam hocevar

1
63 bit không bao giờ được lưu trữ trong một mantissa 53 bit! Đây là giả thời gian của tôi, khá gần với cách hoạt động của người thật: gist.github.com/1753547 . long.MaxValue / TicksPerMillisecondsẽ không bao giờ lớn hơn 2 ^ 53. TimeSpan không thực sự theo dõi bất cứ điều gì như là một đôi trong nội bộ.
Jimmy

@Jimmy: có điều gì đó bạn không hiểu nhưng tôi không biết nó là gì. Kiểm tra ideone.com/1XLuJ để xem lớp của bạn mất độ chính xác như thế nào với các giá trị đánh dấu 60 bit.
sam hocevar

Điều đó có ý nghĩa. Tôi đã giả sử các giá trị tích phân trong một phần nghìn giây. Tôi đã xóa câu trả lời của riêng tôi.
Jimmy

-1

Đây chỉ là một câu đố nhỏ ngớ ngẩn, nhưng nếu bạn không quan tâm đến độ chính xác hoàn hảo (ai quan tâm nếu bạn cho hay mất một giây khi nói về hàng thế kỷ?) Thì TotalTimelà gấp đôi, giá trị tối đa mà nó có thể lưu trữ1.7976931348623157E+308 .

Tôi không chắc chắn làm thế nào tràn hoạt động trong C #, nhưng nếu bạn chạy trò chơi lâu hơn thế này, tôi đoán nó sẽ quay trở lại một cái gì đó như -1.798*10^308 , hoặc đơn giản là không thay đổi. Nó cũng phụ thuộc vào cách nó được thực hiện trong nội bộ.

Điều đó nói rằng, số mili giây đó là khá lớn. Nếu bạn so sánh nó với thời đại giả thuyết của vũ trụ, thì ... Uh ... Chà nó vẫn còn khá lớn .

Tất nhiên, như Sam nói, thời gian thực sự được lưu trữ trong tích tắc (một phần mười của một nano giây?), Vì vậy bạn sẽ chạy vào "giới hạn" sau một khoảng thời gian " ngắn hơn nhiều ". Nó vẫn còn một cái gì đó giống như một khối lập phương của một googol lần so với tuổi của vũ trụ.

Tôi không biết làm thế nào GameTime lưu trữ thời gian, chính xác, vì vậy điều này cũng có nghĩa là bạn có thể không bao giờ thực sự thấy TotalMillisecondsđầu ra "gần" với giá trị tối đa của nó. Mặc dù, nếu thời gian đóng gói thành ngày và năm bất cứ khi nào giá trị bọ ve đủ cao và không chỉ khi bạn gọi getter, thì bộ đếm thời gian sẽ tăng cho đến khi giá trị tối đa tính double bằng năm , thậm chí còn cao hơn .

Nếu, vì một lý do nào đó, trò chơi của bạn nên có nội dung phong phú đến mức đòi hỏi thời gian trong đó rất nhiều vũ trụ được sinh ra và diệt vong để khám phá đầy đủ, tồn tại các loại dữ liệu chuyên biệt để lưu trữ số lượng lớn tùy ý. Java có BigDecimalkích thước cơ bản bị giới hạn bởi RAM của bạn (và thông qua bộ nhớ ảo, thậm chí cả không gian đĩa cứng). Rõ ràng, C # không có BigDecimal, nhưng nó có BigInteger.

Nếu bạn tạo ra một trò chơi có quy mô hoành tráng như vậy, chắc chắn sẽ được chơi bởi chính các vị thần, bạn có thể sẽ bắt đầu bằng cách sao chép BigDecimallớp, sau đó thực hiện lại GameTimelớp (hoặc thậm chí chỉ định kỳ thêm GameTimegiá trị của bạn vào BigDecimal) để sử dụng nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.