2022-02-05 16:30:50 -05:00
|
|
|
#include "FrameLimiter.h"
|
|
|
|
#include <thread>
|
|
|
|
|
|
|
|
double FrameLimiter::round_to_nearest_60fps(double current) {
|
|
|
|
double one_frame = 1.f / 60.f;
|
|
|
|
int frames_missed = (current / one_frame); // rounds down
|
|
|
|
if (frames_missed > 4) {
|
|
|
|
frames_missed = 4;
|
|
|
|
}
|
|
|
|
return (frames_missed + 1) * one_frame;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef __linux__
|
|
|
|
|
|
|
|
FrameLimiter::FrameLimiter() {}
|
|
|
|
|
|
|
|
FrameLimiter::~FrameLimiter() {}
|
|
|
|
|
|
|
|
void FrameLimiter::run(double target_fps,
|
|
|
|
bool experimental_accurate_lag,
|
|
|
|
bool do_sleeps,
|
|
|
|
double engine_time) {
|
|
|
|
double target_seconds;
|
|
|
|
if (experimental_accurate_lag) {
|
|
|
|
target_seconds = round_to_nearest_60fps(engine_time);
|
|
|
|
} else {
|
|
|
|
target_seconds = 1.f / target_fps;
|
|
|
|
}
|
|
|
|
double remaining_time = target_seconds - m_timer.getSeconds();
|
|
|
|
|
|
|
|
if (do_sleeps && remaining_time > 0.001) {
|
|
|
|
std::this_thread::sleep_for(std::chrono::microseconds(int((remaining_time - 0.001) * 1e6)));
|
|
|
|
}
|
|
|
|
|
|
|
|
while (remaining_time > 0) {
|
|
|
|
remaining_time = target_seconds - m_timer.getSeconds();
|
|
|
|
}
|
|
|
|
|
|
|
|
m_timer.start();
|
|
|
|
}
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
2022-05-06 18:19:37 -04:00
|
|
|
#define NOMINMAX
|
2022-02-05 16:30:50 -05:00
|
|
|
#include <Windows.h>
|
|
|
|
|
|
|
|
FrameLimiter::FrameLimiter() {
|
|
|
|
timeBeginPeriod(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
FrameLimiter::~FrameLimiter() {
|
|
|
|
timeEndPeriod(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void FrameLimiter::run(double target_fps,
|
|
|
|
bool experimental_accurate_lag,
|
|
|
|
bool do_sleeps,
|
|
|
|
double engine_time) {
|
|
|
|
double target_seconds;
|
|
|
|
if (experimental_accurate_lag) {
|
|
|
|
target_seconds = round_to_nearest_60fps(engine_time);
|
|
|
|
} else {
|
|
|
|
target_seconds = 1.f / target_fps;
|
|
|
|
}
|
|
|
|
double remaining_time = target_seconds - m_timer.getSeconds();
|
|
|
|
|
|
|
|
if (do_sleeps && remaining_time > 0.001) {
|
|
|
|
Sleep((remaining_time * 1000) - 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
while (remaining_time > 0) {
|
|
|
|
remaining_time = target_seconds - m_timer.getSeconds();
|
|
|
|
}
|
|
|
|
|
|
|
|
m_timer.start();
|
|
|
|
}
|
|
|
|
|
2022-05-06 18:19:37 -04:00
|
|
|
#endif
|