diff --git a/scene/main/node.cpp b/scene/main/node.cpp index 7bad977132f..f27df3a7cad 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -1643,22 +1643,29 @@ void Node::_add_child_nocheck(Node *p_child, const StringName &p_name, InternalM data.children.insert(p_name, p_child); p_child->data.internal_mode = p_internal_mode; + + bool can_push_back = false; switch (p_internal_mode) { case INTERNAL_MODE_FRONT: { p_child->data.index = data.internal_children_front_count_cache++; + // Safe to push back when ordinary and back children are empty. + can_push_back = (data.external_children_count_cache + data.internal_children_back_count_cache) == 0; } break; case INTERNAL_MODE_BACK: { p_child->data.index = data.internal_children_back_count_cache++; + // Safe to push back when cache is valid. + can_push_back = true; } break; case INTERNAL_MODE_DISABLED: { p_child->data.index = data.external_children_count_cache++; + // Safe to push back when back children are empty. + can_push_back = data.internal_children_back_count_cache == 0; } break; } p_child->data.parent = this; - if (!data.children_cache_dirty && p_internal_mode == INTERNAL_MODE_DISABLED && data.internal_children_back_count_cache == 0) { - // Special case, also add to the cached children array since its cheap. + if (!data.children_cache_dirty && can_push_back) { data.children_cache.push_back(p_child); } else { data.children_cache_dirty = true; diff --git a/scene/main/node.h b/scene/main/node.h index 8276b4715f5..2f481a5f192 100644 --- a/scene/main/node.h +++ b/scene/main/node.h @@ -167,7 +167,7 @@ private: Node *parent = nullptr; Node *owner = nullptr; HashMap children; - mutable bool children_cache_dirty = true; + mutable bool children_cache_dirty = false; mutable LocalVector children_cache; HashMap owned_unique_nodes; bool unique_name_in_owner = false;