diff options
author | Juan Linietsky <reduzio@gmail.com> | 2019-01-22 13:17:39 -0300 |
---|---|---|
committer | Juan Linietsky <reduzio@gmail.com> | 2019-01-22 13:17:39 -0300 |
commit | 0c9fd3c4b4f0cd22c6d887daf70bb882e2a00605 (patch) | |
tree | 7979ce95c15edab4a443d6e39a6aeffec6dee082 | |
parent | c70c43c8885006d64224b08ea02e05af13827d73 (diff) |
Avoid cyclic iteration check, fixes #24969
-rw-r--r-- | main/main.cpp | 10 | ||||
-rw-r--r-- | main/main.h | 3 | ||||
-rw-r--r-- | platform/osx/os_osx.mm | 4 | ||||
-rw-r--r-- | platform/windows/os_windows.cpp | 4 |
4 files changed, 19 insertions, 2 deletions
diff --git a/main/main.cpp b/main/main.cpp index cbf30af38c..b94130002d 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -1789,6 +1789,10 @@ uint64_t Main::target_ticks = 0; uint32_t Main::frames = 0; uint32_t Main::frame = 0; bool Main::force_redraw_requested = false; +bool Main::iterating = false; +bool Main::is_iterating() { + return iterating; +} // For performance metrics static uint64_t physics_process_max = 0; @@ -1796,6 +1800,10 @@ static uint64_t idle_process_max = 0; bool Main::iteration() { + ERR_FAIL_COND_V(iterating, false); + + iterating = true; + uint64_t ticks = OS::get_singleton()->get_ticks_usec(); Engine::get_singleton()->_frame_ticks = ticks; main_timer_sync.set_cpu_ticks_usec(ticks); @@ -1923,6 +1931,8 @@ bool Main::iteration() { frames = 0; } + iterating = false; + if (fixed_fps != -1) return exit; diff --git a/main/main.h b/main/main.h index 01fc259a8a..1bdce7d17f 100644 --- a/main/main.h +++ b/main/main.h @@ -47,6 +47,7 @@ class Main { static uint32_t frames; static uint32_t frame; static bool force_redraw_requested; + static bool iterating; public: static bool is_project_manager(); @@ -58,6 +59,8 @@ public: static bool iteration(); static void force_redraw(); + static bool is_iterating(); + static void cleanup(); }; diff --git a/platform/osx/os_osx.mm b/platform/osx/os_osx.mm index ddd98ab88c..760858b2e5 100644 --- a/platform/osx/os_osx.mm +++ b/platform/osx/os_osx.mm @@ -304,7 +304,9 @@ static Vector2 get_mouse_pos(NSPoint locationInWindow, CGFloat backingScaleFacto if (OS_OSX::singleton->main_loop) { Main::force_redraw(); //Event retrieval blocks until resize is over. Call Main::iteration() directly. - Main::iteration(); + if (!Main::is_iterating()) { //avoid cyclic loop + Main::iteration(); + } } /* diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 3b41f1b901..d1693cb0b4 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -783,7 +783,9 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_TIMER: { if (wParam == move_timer_id) { process_key_events(); - Main::iteration(); + if (!Main::is_iterating()) { + Main::iteration(); + } } } break; |