1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Improve sleep accuracy on FPS limiter (#15648)

This commit is contained in:
Hanicef 2025-01-12 14:49:13 +01:00 committed by GitHub
parent d4a6df3389
commit be75e42d77
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 20 additions and 2 deletions

View file

@ -50,8 +50,7 @@ void FpsControl::limit(IrrlichtDevice *device, f32 *dtime, bool assume_paused)
if (busy_time < frametime_min) {
sleep_time = frametime_min - busy_time;
if (sleep_time > 0)
sleep_us(sleep_time);
porting::preciseSleepUs(sleep_time);
} else {
sleep_time = 0;
}

View file

@ -32,12 +32,16 @@
#define sleep_ms(x) Sleep(x)
#define sleep_us(x) Sleep((x)/1000)
#define SLEEP_ACCURACY_US 2000
#define setenv(n,v,o) _putenv_s(n,v)
#define unsetenv(n) _putenv_s(n,"")
#else
#include <unistd.h>
#include <cstdlib> // setenv
#define SLEEP_ACCURACY_US 200
#define sleep_ms(x) usleep((x)*1000)
#define sleep_us(x) usleep(x)
#endif
@ -220,6 +224,21 @@ inline u64 getDeltaMs(u64 old_time_ms, u64 new_time_ms)
return (old_time_ms - new_time_ms);
}
inline void preciseSleepUs(u64 sleep_time)
{
if (sleep_time > 0)
{
u64 target_time = porting::getTimeUs() + sleep_time;
if (sleep_time > SLEEP_ACCURACY_US)
sleep_us(sleep_time - SLEEP_ACCURACY_US);
// Busy-wait the remaining time to adjust for sleep inaccuracies
// The target - now > 0 construct will handle overflow gracefully (even though it should
// never happen)
while ((s64)(target_time - porting::getTimeUs()) > 0) {}
}
}
inline const char *getPlatformName()
{
return