2012-11-08 35 views
8

Tôi có một hàm chạy dấu() cho tất cả người chơi và đối tượng trong máy chủ trò chơi của tôi. Tôi làm điều này bằng cách lặp qua một bộ sau mỗi giây. Tôi cần nó là một chất rắn .1. Rất nhiều thời gian và toán học phụ thuộc vào việc tạm dừng này là chính xác nhất có thể .1 giây. Để đạt được điều này, tôi đã thêm chủ đề này vào chuỗi đánh dấu:Python - time.sleep() bù đắp theo thời lượng mã

start_time = time.time() 

# loops and code and stuff for tick thread in here... 

time_lapsed = time.time() - start_time # get the time it took to run the above code 
if 0.1 - time_lapsed > 0: 
    time.sleep(0.1 - time_lapsed) 
else: 
    print "Server is overloaded!" 
    # server lag is greater that .1, so don't sleep, and just eat it on this run. 
    # the goal is to never see this. 

Câu hỏi của tôi là, đây là cách tốt nhất để làm điều này? Nếu thời lượng của vòng lặp của tôi là 0,01, thì time_lapsed == 0,01 ... và sau đó giấc ngủ chỉ nên là 0,09. Tôi hỏi, bởi vì nó dường như không hoạt động. Tôi bắt đầu nhận được tin nhắn máy chủ bị quá tải vào ngày khác, và máy chủ chắc chắn không bị quá tải. Bất kỳ suy nghĩ về một cách tốt để "tự động" kiểm soát giấc ngủ? Có thể có một cách khác để chạy mã cứ sau mỗi phần mười giây mà không ngủ?

+0

Tôi sẽ thực hiện 'try: time.sleep (0.1 - elapsed); ngoại trừ: pass' chỉ để giảm thời gian tính toán với câu lệnh if. Nhưng tất cả mọi thứ khác có vẻ tốt – inspectorG4dget

+1

Có vẻ như khá rõ ràng rằng đối với một số lý do của bạn 'vòng và mã và các công cụ cho chuỗi đánh dấu' là dùng dài hơn 100ms. Bạn chắc chắn rằng máy chủ "chắc chắn không bị quá tải"? – bdares

+0

Bạn đang sử dụng hệ điều hành nào? Điều quan trọng là chọn chức năng tốt nhất –

Trả lời

2

Các chủ đề Python khác có thể chạy ở giữa việc rời khỏi chuỗi của bạn ít thời gian hơn. Ngoài ra time.time() là tùy thuộc vào điều chỉnh thời gian của hệ thống; nó có thể được thiết lập trở lại.

Có chức năng tương tự Clock.tick() in pygame. Mục đích của nó là giới hạn tốc độ khung hình tối đa.

Để tránh ảnh hưởng bên ngoài, bạn có thể giữ bộ đếm khung/lượt theo lượt độc lập để đo thời gian trò chơi.

+0

Ồ! Vì vậy, nếu tôi hiểu được quyền này, tôi có thể xóa hoàn toàn time.time và time.sleep hoàn toàn và chỉ cần thêm Clock.tick (10) và điều đó sẽ giới hạn chuỗi đánh dấu của tôi thành 10 vòng một giây, đó là những gì tôi cần . Có đúng không? – jtsmith1287

3

Sẽ tốt hơn nếu căn cứ vào "thời gian và toán học" của bạn về khoảng thời gian thực sự trôi qua kể từ lần đánh dấu cuối cùng(). Tùy thuộc vào thời gian "rất chính xác" sẽ dễ vỡ vào thời điểm tốt nhất.

Cập nhật: ý tôi là phương thức tick() của bạn sẽ lấy một đối số, nói "t", trong khoảng thời gian đã trôi qua kể từ lần gọi cuối cùng. Sau đó, để thực hiện chuyển động, bạn sẽ lưu trữ vị trí của mỗi vật (nói theo pixel) và vận tốc (theo "pixel/giây") để độ lớn chuyển động của nó cho cuộc gọi đó để đánh dấu() trở thành "vận tốc * t".

Điều này có lợi ích bổ sung là tách mô phỏng vật lý của bạn khỏi tốc độ khung hình.

Tôi thấy pygame được đề cập bên dưới: phương thức "pygame.time.Clock.tick()" của chúng được sử dụng theo cách này, vì nó trả về số giây kể từ lần cuối bạn gọi nó.

+0

Bạn có sẵn lòng giải thích ý tưởng này thêm một chút không? Âm thanh đầy hứa hẹn, nhưng tôi không chắc tôi hiểu. – jtsmith1287

Các vấn đề liên quan