mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 11:26:18 -04:00
7b6d732a77
* goalc: cleanup goalc's main method and add nrepl listener socket * deps: add standalone ASIO for sockets * lint: formatting * common: make a common interface for creating a server socket * goalc: setup new repl server * deps: remove asio * goalc: debug issues, nrepl is working again * git: rename files * attempt to fix linux function call * test * scripts: make the error message even more obvious.... * goalc: make suggested changes, still can't reconnect properly * game: pull out single-client logic from XSocketServer * nrepl: supports multiple clients and disconnection/reconnects * goalc: some minor fixes for tests * goalc: save repl history when the compiler reloads * common: add include for linux networking * a few small changes to fix tests * is it the assert? * change thread start order and add a print to an assert Co-authored-by: water <awaterford111445@gmail.com>
79 lines
1.8 KiB
C++
79 lines
1.8 KiB
C++
#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
|
|
|
|
#define NOMINMAX
|
|
#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();
|
|
}
|
|
|
|
#endif
|