diff --git a/scene/main/node.cpp b/scene/main/node.cpp index da99df28928..c0ab74df258 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -1814,14 +1814,30 @@ Node *Node::get_child(int p_index, bool p_include_internal) const { TypedArray Node::get_children(bool p_include_internal) const { ERR_THREAD_GUARD_V(TypedArray()); - TypedArray arr; - int cc = get_child_count(p_include_internal); - arr.resize(cc); - for (int i = 0; i < cc; i++) { - arr[i] = get_child(i, p_include_internal); + _update_children_cache(); + + TypedArray children; + + if (p_include_internal) { + children.resize(data.children_cache.size()); + + Array::Iterator itr = children.begin(); + for (const Node *child : data.children_cache) { + *itr = child; + ++itr; + } + } else { + const int size = data.children_cache.size() - data.internal_children_back_count_cache; + children.resize(size - data.internal_children_front_count_cache); + + Array::Iterator itr = children.begin(); + for (int i = data.internal_children_front_count_cache; i < size; i++) { + *itr = data.children_cache[i]; + ++itr; + } } - return arr; + return children; } Node *Node::_get_child_by_name(const StringName &p_name) const {