浏览代码

Merge pull request #55514 from RandomShaper/better_node_delete_3.x

Rémi Verschelde 3 年之前
父节点
当前提交
e22f7ea3c0
共有 2 个文件被更改,包括 4 次插入37 次删除
  1. 4 36
      scene/main/node.cpp
  2. 0 1
      scene/main/node.h

+ 4 - 36
scene/main/node.cpp

@@ -151,12 +151,6 @@ void Node::_notification(int p_notification) {
 			data.in_constructor = false;
 		} break;
 		case NOTIFICATION_PREDELETE: {
-			set_owner(nullptr);
-
-			while (data.owned.size()) {
-				data.owned.front()->get()->set_owner(nullptr);
-			}
-
 			if (data.parent) {
 				data.parent->remove_child(this);
 			}
@@ -164,10 +158,8 @@ void Node::_notification(int p_notification) {
 			// kill children as cleanly as possible
 			while (data.children.size()) {
 				Node *child = data.children[data.children.size() - 1]; //begin from the end because its faster and more consistent with creation
-				remove_child(child);
 				memdelete(child);
 			}
-
 		} break;
 	}
 }
@@ -242,6 +234,10 @@ void Node::_propagate_enter_tree() {
 }
 
 void Node::_propagate_after_exit_tree() {
+	if (data.owner) {
+		data.owner->data.owned.erase(data.OW);
+		data.owner = nullptr;
+	}
 	data.blocked++;
 	for (int i = 0; i < data.children.size(); i++) {
 		data.children[i]->_propagate_after_exit_tree();
@@ -1153,31 +1149,6 @@ void Node::add_child_below_node(Node *p_node, Node *p_child, bool p_legible_uniq
 	}
 }
 
-void Node::_propagate_validate_owner() {
-	if (data.owner) {
-		bool found = false;
-		Node *parent = data.parent;
-
-		while (parent) {
-			if (parent == data.owner) {
-				found = true;
-				break;
-			}
-
-			parent = parent->data.parent;
-		}
-
-		if (!found) {
-			data.owner->data.owned.erase(data.OW);
-			data.owner = nullptr;
-		}
-	}
-
-	for (int i = 0; i < data.children.size(); i++) {
-		data.children[i]->_propagate_validate_owner();
-	}
-}
-
 void Node::remove_child(Node *p_child) {
 	ERR_FAIL_NULL(p_child);
 	ERR_FAIL_COND_MSG(data.blocked > 0, "Parent node is busy setting up children, remove_node() failed. Consider using call_deferred(\"remove_child\", child) instead.");
@@ -1226,9 +1197,6 @@ void Node::remove_child(Node *p_child) {
 	p_child->data.parent = nullptr;
 	p_child->data.pos = -1;
 
-	// validate owner
-	p_child->_propagate_validate_owner();
-
 	if (data.inside_tree) {
 		p_child->_propagate_after_exit_tree();
 	}

+ 0 - 1
scene/main/node.h

@@ -162,7 +162,6 @@ private:
 	void _propagate_ready();
 	void _propagate_exit_tree();
 	void _propagate_after_exit_tree();
-	void _propagate_validate_owner();
 	void _print_stray_nodes();
 	void _propagate_pause_owner(Node *p_owner);
 	Array _get_node_and_resource(const NodePath &p_path);