From 83f065c0ef921d2ef520bb355a25e2bbf487e231 Mon Sep 17 00:00:00 2001 From: Nickolai Korshunov Date: Sat, 28 Jan 2023 15:25:03 +0300 Subject: [PATCH] Ensure that SceneTree is initialized and finalized at correct time SceneTree should be fully initialized before any tree operation with any node and finalized only after all nodes exited tree. --- scene/main/scene_tree.cpp | 15 ++++++--------- scene/main/scene_tree.h | 1 - 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index 6eec6b83713..8e5c63196b8 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -444,9 +444,8 @@ void SceneTree::set_group(const StringName &p_group, const String &p_name, const void SceneTree::initialize() { ERR_FAIL_NULL(root); - initialized = true; - root->_set_tree(this); MainLoop::initialize(); + root->_set_tree(this); } bool SceneTree::physics_process(double p_time) { @@ -618,20 +617,18 @@ void SceneTree::finalize() { _flush_ugc(); - initialized = false; - - MainLoop::finalize(); - if (root) { root->_set_tree(nullptr); root->_propagate_after_exit_tree(); memdelete(root); //delete root root = nullptr; + + // In case deletion of some objects was queued when destructing the `root`. + // E.g. if `queue_free()` was called for some node outside the tree when handling NOTIFICATION_PREDELETE for some node in the tree. + _flush_delete_queue(); } - // In case deletion of some objects was queued when destructing the `root`. - // E.g. if `queue_free()` was called for some node outside the tree when handling NOTIFICATION_PREDELETE for some node in the tree. - _flush_delete_queue(); + MainLoop::finalize(); // Cleanup timers. for (Ref &timer : timers) { diff --git a/scene/main/scene_tree.h b/scene/main/scene_tree.h index 452fac7423f..9b550f71358 100644 --- a/scene/main/scene_tree.h +++ b/scene/main/scene_tree.h @@ -138,7 +138,6 @@ private: HashMap group_map; bool _quit = false; - bool initialized = false; StringName tree_changed_name = "tree_changed"; StringName node_added_name = "node_added";