Có an toàn khi sử dụng Sleep () trong vòng lặp trò chơi (trên Windows) không?


27

Có an toàn khi sử dụng chức năng Ngủ () trên Windows trong vòng lặp trò chơi (C ++) không? Tôi muốn có tốc độ khung hình cố định.


Bạn cần làm rõ, ý của bạn là "an toàn". Tất nhiên, nó an toàn và sẽ không làm hỏng bộ nhớ hoặc làm nổ tung PC của người chơi.
Kromster nói hỗ trợ Monica

Câu trả lời:


32

Không, không phải vậy. Giấc ngủ chỉ đảm bảo thời gian tối thiểu để ngủ, nhưng nó thực sự có thể ngủ trong bất kỳ khoảng thời gian tùy ý nào trong thời gian đó. Độ phân giải hẹn giờ của bạn (được đặt qua timeBeginPeriod) cũng rất quan trọng đối với nó và ngay cả khi bạn đang sử dụng một thứ khác (như QueryPerformanceCorer) cho bộ hẹn giờ của mình, bạn vẫn cần timeBeginPeriod để điều khiển Ngủ.

Vì vậy, tóm lại:

  • Thời gian để ngủ chỉ là tối thiểu được đảm bảo và thời gian ngủ thực tế có thể cao hơn.
  • Nhạy cảm với giá trị được đặt (hoặc không được đặt) qua timeBeginPeriod.

Trường hợp hợp lý duy nhất để sử dụng chế độ Ngủ là nếu bạn muốn giảm mức sử dụng CPU cho các thiết bị di động. Thậm chí sau đó bạn sẽ sử dụng chế độ Ngủ (1); sử dụng nó để kiểm soát tốc độ khung hình không phải là cách để đi.

Buộc vsync có lẽ là một cách phổ biến để có tốc độ khung hình cố định, nhưng ngay cả khi đó, phần cứng khác nhau sẽ chạy ở các tốc độ làm mới khác nhau và bạn sẽ không thể có tốc độ khung hình cố định nhất quán trên các máy khác nhau (điều này phụ thuộc vào loại phần cứng nào bạn đang nhắm mục tiêu tất nhiên).

Tại thời điểm này, cần phải đề cập đến bài viết này: Gaffer On Games - Khắc phục dấu thời gian của bạn! . Điều đó mô tả các bước bạn cần để có một dấu thời gian nhất quán trong mô phỏng của bạn.


Rất cảm ơn cho các liên kết. Cho đến bây giờ, tôi thường sử dụng phương pháp "biến thời gian" được mô tả trong bài viết.
Ivan Vučica

Ngủ cũng nguy hiểm trên các máy có bật tốc độ Intel.
waterwizard11

"nhưng nó thực sự có thể ngủ trong bất kỳ khoảng thời gian tùy ý nào trong thời gian đó." Chà, điều đó phải được chứng minh tôi đoán ... Chưa bao giờ thấy bất kỳ bằng chứng nào về nó nên tôi đoán đó là một trong những 'định nghĩa'. Mặc dù vậy, câu trả lời tốt và đúng, bạn không thể (ngay cả khi nó là chính xác) sử dụng bất kỳ loại Ngủ nào để đặt tốc độ khung hình cố định (bạn cũng có thể nhưng bạn cần một bộ đếm thời gian chính xác cao để làm điều đó).
Valmond

2
Mỗi MSDN - "Lưu ý rằng một luồng sẵn sàng không được đảm bảo để chạy ngay lập tức. Do đó, luồng có thể không chạy cho đến một thời gian sau khi khoảng thời gian ngủ trôi qua". Đúng, tôi chưa bao giờ thấy nó xảy ra, nhưng đồng thời nếu nó được ghi nhận là có thể, tôi chắc chắn sẽ không dựa vào nó không bao giờ xảy ra.
Maximus Minimus

1
Đáng nói hơn, tôi nghĩ điều này sẽ liên quan đến "... nếu bạn muốn giảm mức sử dụng CPU ...": nanobit.net/doxy/quake3/win__main_8c-source.html <- mã có liên quan bắt đầu vào ngày 01224
user_123abc

16

Câu trả lời ngắn gọn: không, không phải vậy.

Để có tốc độ khung hình cố định, bạn phải gọi một hàm gọi lại nhất định buộc tốc độ khung hình cụ thể. Rõ ràng, nếu bây giờ bạn không lặp lại một vòng lặp trong bao lâu thì bạn không thể đặt thời gian ngủ cố định.

GLUT cung cấp glutTimerFunc () , nghĩa là, nếu bạn đang lập trình trong OpenGL, đúng chức năng bạn cần. Hãy xem ví dụ này , hoặc cái này .


1
"Sau ít nhất mili giây, OpenGLUT sẽ gọi lại" - nó khác với Sleepnhư thế nào?
Kromster nói hỗ trợ Monica
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.