You've already forked godot
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:
@@ -1647,22 +1647,29 @@ void Node::_add_child_nocheck(Node *p_child, const StringName &p_name, InternalM
|
|||||||
data.children.insert(p_name, p_child);
|
data.children.insert(p_name, p_child);
|
||||||
|
|
||||||
p_child->data.internal_mode = p_internal_mode;
|
p_child->data.internal_mode = p_internal_mode;
|
||||||
|
|
||||||
|
bool can_push_back = false;
|
||||||
switch (p_internal_mode) {
|
switch (p_internal_mode) {
|
||||||
case INTERNAL_MODE_FRONT: {
|
case INTERNAL_MODE_FRONT: {
|
||||||
p_child->data.index = data.internal_children_front_count_cache++;
|
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;
|
} break;
|
||||||
case INTERNAL_MODE_BACK: {
|
case INTERNAL_MODE_BACK: {
|
||||||
p_child->data.index = data.internal_children_back_count_cache++;
|
p_child->data.index = data.internal_children_back_count_cache++;
|
||||||
|
// Safe to push back when cache is valid.
|
||||||
|
can_push_back = true;
|
||||||
} break;
|
} break;
|
||||||
case INTERNAL_MODE_DISABLED: {
|
case INTERNAL_MODE_DISABLED: {
|
||||||
p_child->data.index = data.external_children_count_cache++;
|
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;
|
} break;
|
||||||
}
|
}
|
||||||
|
|
||||||
p_child->data.parent = this;
|
p_child->data.parent = this;
|
||||||
|
|
||||||
if (!data.children_cache_dirty && p_internal_mode == INTERNAL_MODE_DISABLED && data.internal_children_back_count_cache == 0) {
|
if (!data.children_cache_dirty && can_push_back) {
|
||||||
// Special case, also add to the cached children array since its cheap.
|
|
||||||
data.children_cache.push_back(p_child);
|
data.children_cache.push_back(p_child);
|
||||||
} else {
|
} else {
|
||||||
data.children_cache_dirty = true;
|
data.children_cache_dirty = true;
|
||||||
|
|||||||
@@ -196,7 +196,7 @@ private:
|
|||||||
Node *parent = nullptr;
|
Node *parent = nullptr;
|
||||||
Node *owner = nullptr;
|
Node *owner = nullptr;
|
||||||
HashMap<StringName, Node *> children;
|
HashMap<StringName, Node *> children;
|
||||||
mutable bool children_cache_dirty = true;
|
mutable bool children_cache_dirty = false;
|
||||||
mutable LocalVector<Node *> children_cache;
|
mutable LocalVector<Node *> children_cache;
|
||||||
HashMap<StringName, Node *> owned_unique_nodes;
|
HashMap<StringName, Node *> owned_unique_nodes;
|
||||||
bool unique_name_in_owner = false;
|
bool unique_name_in_owner = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user