86 float sync(
int desired_fps = 0) {
87 const uint64_t frequency = SDL_GetPerformanceFrequency();
88 uint64_t current_time = SDL_GetPerformanceCounter();
89 int64_t delta_time =
static_cast<int64_t
>(current_time - last_time_);
90 if (desired_fps > 0) {
91 const int64_t desired_delta_time = frequency / desired_fps;
92 const int64_t time_until_next_frame_ms =
93 (desired_delta_time - delta_time) * 1000 /
static_cast<int64_t
>(frequency);
94 if (time_until_next_frame_ms > 2) {
96 SDL_Delay(
static_cast<uint32_t
>(time_until_next_frame_ms) - 1);
98 while (delta_time < desired_delta_time) {
99 current_time = SDL_GetPerformanceCounter();
100 delta_time =
static_cast<int64_t
>(current_time - last_time_);
103 last_time_ = current_time;
104 const float delta_time_s = std::max(0.0f,
static_cast<float>(delta_time) / frequency);
106 double total_time = std::accumulate(samples_.begin(), samples_.end(), 0.0);
107 while (!samples_.empty() && (total_time > MAX_SAMPLES_TIME || samples_.size() >= MAX_SAMPLES_COUNT)) {
108 total_time -= samples_.front();
109 samples_.pop_front();
111 samples_.push_back(delta_time_s);
153 if (samples_.empty())
return 0;
154 std::vector<float> samples(samples_.begin(), samples_.end());
155 std::sort(samples.begin(), samples.end());
156 float median_sample = samples[samples.size() / 2];
157 if (samples.size() % 2 == 0 && samples.size() > 2) {
158 median_sample = (median_sample + samples[samples.size() / 2 + 1]) / 2.0f;
160 if (median_sample == 0)
return 0;
161 return 1.0f / median_sample;