1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

Merge pull request #110650 from WhalesState/node-cache-less-dirty

Optimize children cache updates and refine special-case handling
This commit is contained in:
Thaddeus Crews
2025-10-13 12:30:14 -05:00
2 changed files with 10 additions and 3 deletions

View File

@@ -1647,22 +1647,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;

View File

@@ -196,7 +196,7 @@ private:
Node *parent = nullptr;
Node *owner = nullptr;
HashMap<StringName, Node *> children;
mutable bool children_cache_dirty = true;
mutable bool children_cache_dirty = false;
mutable LocalVector<Node *> children_cache;
HashMap<StringName, Node *> owned_unique_nodes;
bool unique_name_in_owner = false;