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.
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.
Câu trả lời:
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:
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.
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 .
Sleep
như thế nào?