Răsfoiți Sursa

Add a limit of previously known last element to timer timeout traversal in SceneTree, fixes #15559

Juan Linietsky 6 ani în urmă
părinte
comite
37c5aa1084
1 a modificat fișierele cu 8 adăugiri și 0 ștergeri
  1. 8 0
      scene/main/scene_tree.cpp

+ 8 - 0
scene/main/scene_tree.cpp

@@ -535,10 +535,15 @@ bool SceneTree::idle(float p_time) {
 
 	//go through timers
 
+	List<Ref<SceneTreeTimer> >::Element *L = timers.back(); //last element
+
 	for (List<Ref<SceneTreeTimer> >::Element *E = timers.front(); E;) {
 
 		List<Ref<SceneTreeTimer> >::Element *N = E->next();
 		if (pause && !E->get()->is_pause_mode_process()) {
+			if (E == L) {
+				break; //break on last, so if new timers were added during list traversal, ignore them.
+			}
 			E = N;
 			continue;
 		}
@@ -550,6 +555,9 @@ bool SceneTree::idle(float p_time) {
 			E->get()->emit_signal("timeout");
 			timers.erase(E);
 		}
+		if (E == L) {
+			break; //break on last, so if new timers were added during list traversal, ignore them.
+		}
 		E = N;
 	}