1
0
mirror of https://github.com/godotengine/godot.git synced 2025-12-07 17:36:07 +00:00

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.
This commit is contained in:
Nickolai Korshunov
2023-01-28 15:25:03 +03:00
committed by Nickolai Korshunov
parent 329652b6fe
commit 83f065c0ef
2 changed files with 6 additions and 10 deletions

View File

@@ -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<SceneTreeTimer> &timer : timers) {