Improve Tween infinite loop detection

(cherry picked from commit f473aab00d)
This commit is contained in:
kobewi 2022-04-30 23:19:20 +02:00 committed by Rémi Verschelde
parent 86b14496b1
commit ce36f2f699
2 changed files with 18 additions and 10 deletions

View file

@ -272,14 +272,15 @@ bool SceneTreeTween::step(float p_delta) {
bool step_active = false;
total_time += rem_delta;
#ifdef DEBUG_ENABLED
float initial_delta = rem_delta;
bool potential_infinite = false;
#endif
while (rem_delta > 0 && running) {
float step_delta = rem_delta;
step_active = false;
#ifdef DEBUG_ENABLED
float prev_delta = rem_delta;
#endif
List<Ref<Tweener>> &step = tweeners.write[current_step];
for (int i = 0; i < step.size(); i++) {
Ref<Tweener> &tweener = step[i];
@ -307,17 +308,21 @@ bool SceneTreeTween::step(float p_delta) {
emit_signal(SceneStringNames::get_singleton()->loop_finished, loops_done);
current_step = 0;
start_tweeners();
#ifdef DEBUG_ENABLED
if (loops <= 0 && Math::is_equal_approx(rem_delta, initial_delta)) {
if (!potential_infinite) {
potential_infinite = true;
} else {
// Looped twice without using any time, this is 100% certain infinite loop.
ERR_FAIL_V_MSG(false, "Infinite loop detected. Check set_loops() description for more info.");
}
}
#endif
}
} else {
start_tweeners();
}
}
#ifdef DEBUG_ENABLED
if (Math::is_equal_approx(rem_delta, prev_delta) && running && loops <= 0) {
ERR_FAIL_V_MSG(false, "Infinite loop detected. Check set_loops() description for more info.");
}
#endif
}
return true;

View file

@ -88,6 +88,9 @@ private:
bool valid = false;
bool default_parallel = false;
bool parallel_enabled = false;
#ifdef DEBUG_ENABLED
bool is_infinite = false;
#endif
void start_tweeners();