การใช้ฟังก์ชั่น Sleep () บน Windows ใน Game loop (C ++) ปลอดภัยหรือไม่? ฉันต้องการให้เฟรมเรทคงที่
การใช้ฟังก์ชั่น Sleep () บน Windows ใน Game loop (C ++) ปลอดภัยหรือไม่? ฉันต้องการให้เฟรมเรทคงที่
คำตอบ:
ไม่มันไม่ใช่. การนอนหลับรับประกันได้ว่าจะให้เวลาขั้นต่ำในการนอนหลับเท่านั้น ความละเอียดของตัวจับเวลาของคุณ (ตั้งค่าผ่าน timeBeginPeriod) ก็มีความสำคัญเช่นกันและแม้ว่าคุณจะใช้อย่างอื่น (เช่น QueryPerformanceCounter) สำหรับตัวจับเวลาของคุณ
ดังนั้นโดยสรุป:
กรณีที่เหมาะสมเพียงอย่างเดียวในการใช้ Sleep คือถ้าคุณต้องการลดการใช้งาน CPU สำหรับอุปกรณ์มือถือ แม้ว่าคุณจะใช้โหมดสลีป (1); การใช้มันเพื่อควบคุม framerates ไม่ใช่วิธีที่จะไป
การบังคับใช้ vsync บนอาจเป็นวิธีหนึ่งที่ใช้กันโดยทั่วไปเพื่อให้ได้อัตราเฟรมคงที่ แต่ถึงอย่างนั้นฮาร์ดแวร์ที่แตกต่างกันจะทำงานที่อัตราการรีเฟรชที่แตกต่างกันและคุณจะไม่สามารถมีอัตราคงที่คงที่สม่ำเสมอในเครื่องต่างๆ คุณกำลังกำหนดเป้าหมายแน่นอน)
ในเวลานี้จำเป็นต้องพูดถึงบทความนี้: Gaffer On Games - Fix Timestep ของคุณ! . ที่อธิบายถึงขั้นตอนที่คุณต้องได้รับการประทับเวลาที่สอดคล้องกันในการจำลองของคุณ
คำตอบสั้น ๆ : ไม่มันไม่ใช่
ในการมีอัตราเฟรมคงที่คุณต้องเรียกฟังก์ชันการเรียกกลับที่แน่นอนซึ่งบังคับให้อัตราเฟรมเฉพาะ เห็นได้ชัดว่าถ้าคุณไม่ได้ทำซ้ำในลูปนานเท่าไหร่คุณจะไม่สามารถกำหนดเวลาพักเครื่องได้
GLUT จัดเตรียมglutTimerFunc ()ซึ่งถ้าคุณกำลังเขียนโปรแกรมใน OpenGL ฟังก์ชั่นที่เหมาะสมที่คุณต้องการ ลองดูที่ตัวอย่างนี้หรือนี้อย่างใดอย่างหนึ่ง
Sleep
อย่างไร