Răsfoiți Sursa

Merge pull request #60671 from KoBeWi/infiniten't

Improve Tween infinite loop detection
Rémi Verschelde 3 ani în urmă
părinte
comite
4a9e8b560a
2 a modificat fișierele cu 18 adăugiri și 10 ștergeri
  1. 15 10
      scene/animation/tween.cpp
  2. 3 0
      scene/animation/tween.h

+ 15 - 10
scene/animation/tween.cpp

@@ -278,14 +278,15 @@ bool Tween::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
-
 		for (Ref<Tweener> &tweener : tweeners.write[current_step]) {
 			// Modified inside Tweener.step().
 			float temp_delta = rem_delta;
@@ -310,17 +311,21 @@ bool Tween::step(float p_delta) {
 					emit_signal(SNAME("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;

+ 3 - 0
scene/animation/tween.h

@@ -116,6 +116,9 @@ private:
 	bool valid = false;
 	bool default_parallel = false;
 	bool parallel_enabled = false;
+#ifdef DEBUG_ENABLED
+	bool is_infinite = false;
+#endif
 
 	typedef real_t (*interpolater)(real_t t, real_t b, real_t c, real_t d);
 	static interpolater interpolaters[TRANS_MAX][EASE_MAX];