mirror of
https://github.com/godotengine/godot.git
synced 2025-12-08 06:09:55 +00:00
Add project setting for agile input event flushing
If enabled, key/touch/joystick events will be flushed just before every idle and physics frame. Enabling this can greatly improve the responsiveness to input, specially in devices that need to run multiple physics frames per each idle frame, because of not being powerful enough to run at the target frame rate. This will only work for platforms using input buffering (regardless event accumulation). Currenly, only Android does so, but could be implemented for iOS in an upcoming PR.
This commit is contained in:
parent
dc187324be
commit
abdfbef075
3 changed files with 22 additions and 4 deletions
|
|
@ -1735,6 +1735,8 @@ Error Main::setup2(Thread::ID p_main_tid_override) {
|
|||
|
||||
Input *id = Input::get_singleton();
|
||||
if (id) {
|
||||
agile_input_event_flushing = GLOBAL_DEF("input_devices/buffering/agile_event_flushing", false);
|
||||
|
||||
if (bool(GLOBAL_DEF("input_devices/pointing/emulate_touch_from_mouse", false)) &&
|
||||
!(editor || project_manager)) {
|
||||
bool found_touchscreen = false;
|
||||
|
|
@ -2442,6 +2444,7 @@ uint32_t Main::frames = 0;
|
|||
uint32_t Main::frame = 0;
|
||||
bool Main::force_redraw_requested = false;
|
||||
int Main::iterating = 0;
|
||||
bool Main::agile_input_event_flushing = false;
|
||||
|
||||
bool Main::is_iterating() {
|
||||
return iterating > 0;
|
||||
|
|
@ -2491,9 +2494,13 @@ bool Main::iteration() {
|
|||
|
||||
bool exit = false;
|
||||
|
||||
Engine::get_singleton()->_in_physics = true;
|
||||
|
||||
for (int iters = 0; iters < advance.physics_steps; ++iters) {
|
||||
if (Input::get_singleton()->is_using_input_buffering() && agile_input_event_flushing) {
|
||||
Input::get_singleton()->flush_buffered_events();
|
||||
}
|
||||
|
||||
Engine::get_singleton()->_in_physics = true;
|
||||
|
||||
uint64_t physics_begin = OS::get_singleton()->get_ticks_usec();
|
||||
|
||||
PhysicsServer3D::get_singleton()->sync();
|
||||
|
|
@ -2522,9 +2529,13 @@ bool Main::iteration() {
|
|||
physics_process_ticks = MAX(physics_process_ticks, OS::get_singleton()->get_ticks_usec() - physics_begin); // keep the largest one for reference
|
||||
physics_process_max = MAX(OS::get_singleton()->get_ticks_usec() - physics_begin, physics_process_max);
|
||||
Engine::get_singleton()->_physics_frames++;
|
||||
|
||||
Engine::get_singleton()->_in_physics = false;
|
||||
}
|
||||
|
||||
Engine::get_singleton()->_in_physics = false;
|
||||
if (Input::get_singleton()->is_using_input_buffering() && agile_input_event_flushing) {
|
||||
Input::get_singleton()->flush_buffered_events();
|
||||
}
|
||||
|
||||
uint64_t process_begin = OS::get_singleton()->get_ticks_usec();
|
||||
|
||||
|
|
@ -2588,7 +2599,7 @@ bool Main::iteration() {
|
|||
iterating--;
|
||||
|
||||
// Needed for OSs using input buffering regardless accumulation (like Android)
|
||||
if (Input::get_singleton()->is_using_input_buffering()) {
|
||||
if (Input::get_singleton()->is_using_input_buffering() && !agile_input_event_flushing) {
|
||||
Input::get_singleton()->flush_buffered_events();
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue