Pārlūkot izejas kodu

Merge pull request #99178 from mrsaturnsan/windows_sleep_precision

Make `delay_usec` more precise on Windows to fix framepacing
Thaddeus Crews 8 mēneši atpakaļ
vecāks
revīzija
449d90b64e
1 mainītis faili ar 16 papildinājumiem un 4 dzēšanām
  1. 16 4
      platform/windows/os_windows.cpp

+ 16 - 4
platform/windows/os_windows.cpp

@@ -817,10 +817,22 @@ double OS_Windows::get_unix_time() const {
 }
 
 void OS_Windows::delay_usec(uint32_t p_usec) const {
-	if (p_usec < 1000) {
-		Sleep(1);
-	} else {
-		Sleep(p_usec / 1000);
+	constexpr uint32_t tolerance = 1000 + 20;
+
+	uint64_t t0 = get_ticks_usec();
+	uint64_t target_time = t0 + p_usec;
+
+	// Calculate sleep duration with a tolerance for fine-tuning.
+	if (p_usec > tolerance) {
+		uint32_t coarse_sleep_usec = p_usec - tolerance;
+		if (coarse_sleep_usec >= 1000) {
+			Sleep(coarse_sleep_usec / 1000);
+		}
+	}
+
+	// Spin-wait until we reach the precise target time.
+	while (get_ticks_usec() < target_time) {
+		YieldProcessor();
 	}
 }