Move frame delaying functions from Main to OS.
Will allow specific platforms to override it and avoid blocking on the main/GUI thread.
This commit is contained in:
parent
84e9e58084
commit
1b6e3458b2
4 changed files with 40 additions and 34 deletions
|
|
@ -41,6 +41,7 @@
|
|||
#include <stdarg.h>
|
||||
|
||||
OS *OS::singleton = nullptr;
|
||||
uint64_t OS::target_ticks = 0;
|
||||
|
||||
OS *OS::get_singleton() {
|
||||
return singleton;
|
||||
|
|
@ -468,6 +469,41 @@ void OS::close_midi_inputs() {
|
|||
}
|
||||
}
|
||||
|
||||
void OS::add_frame_delay(bool p_can_draw) {
|
||||
const uint32_t frame_delay = Engine::get_singleton()->get_frame_delay();
|
||||
if (frame_delay) {
|
||||
// Add fixed frame delay to decrease CPU/GPU usage. This doesn't take
|
||||
// the actual frame time into account.
|
||||
// Due to the high fluctuation of the actual sleep duration, it's not recommended
|
||||
// to use this as a FPS limiter.
|
||||
delay_usec(frame_delay * 1000);
|
||||
}
|
||||
|
||||
// Add a dynamic frame delay to decrease CPU/GPU usage. This takes the
|
||||
// previous frame time into account for a smoother result.
|
||||
uint64_t dynamic_delay = 0;
|
||||
if (is_in_low_processor_usage_mode() || !p_can_draw) {
|
||||
dynamic_delay = get_low_processor_usage_mode_sleep_usec();
|
||||
}
|
||||
const int target_fps = Engine::get_singleton()->get_target_fps();
|
||||
if (target_fps > 0 && !Engine::get_singleton()->is_editor_hint()) {
|
||||
// Override the low processor usage mode sleep delay if the target FPS is lower.
|
||||
dynamic_delay = MAX(dynamic_delay, (uint64_t)(1000000 / target_fps));
|
||||
}
|
||||
|
||||
if (dynamic_delay > 0) {
|
||||
target_ticks += dynamic_delay;
|
||||
uint64_t current_ticks = get_ticks_usec();
|
||||
|
||||
if (current_ticks < target_ticks) {
|
||||
delay_usec(target_ticks - current_ticks);
|
||||
}
|
||||
|
||||
current_ticks = get_ticks_usec();
|
||||
target_ticks = MIN(MAX(target_ticks, current_ticks - dynamic_delay), current_ticks + dynamic_delay);
|
||||
}
|
||||
}
|
||||
|
||||
OS::OS() {
|
||||
void *volatile stack_bottom;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue