-Heavily improved editor startup and exit performance
This commit is contained in:
parent
193272aa8a
commit
d61b91cbe0
10 changed files with 229 additions and 194 deletions
|
|
@ -168,11 +168,8 @@ void Node::_propagate_enter_tree() {
|
|||
|
||||
data.inside_tree=true;
|
||||
|
||||
const StringName *K=NULL;
|
||||
|
||||
while ((K=data.grouped.next(K))) {
|
||||
|
||||
data.tree->add_to_group(*K,this);
|
||||
for (Map< StringName, GroupData>::Element *E=data.grouped.front();E;E=E->next()) {
|
||||
E->get().group=data.tree->add_to_group(E->key(),this);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -257,13 +254,13 @@ void Node::_propagate_exit_tree() {
|
|||
data.tree->node_removed(this);
|
||||
|
||||
// exit groups
|
||||
const StringName *K=NULL;
|
||||
|
||||
while ((K=data.grouped.next(K))) {
|
||||
|
||||
data.tree->remove_from_group(*K,this);
|
||||
for (Map< StringName, GroupData>::Element *E=data.grouped.front();E;E=E->next()) {
|
||||
data.tree->remove_from_group(E->key(),this);
|
||||
E->get().group=NULL;
|
||||
}
|
||||
|
||||
|
||||
data.viewport = NULL;
|
||||
|
||||
if (data.tree)
|
||||
|
|
@ -307,6 +304,9 @@ void Node::move_child(Node *p_child,int p_pos) {
|
|||
data.children[i]->notification( NOTIFICATION_MOVED_IN_PARENT );
|
||||
|
||||
}
|
||||
for (const Map< StringName, GroupData>::Element *E=p_child->data.grouped.front();E;E=E->next()) {
|
||||
E->get().group->changed=true;
|
||||
}
|
||||
|
||||
data.blocked--;
|
||||
|
||||
|
|
@ -1193,8 +1193,12 @@ void Node::add_to_group(const StringName& p_identifier,bool p_persistent) {
|
|||
|
||||
GroupData gd;
|
||||
|
||||
if (data.tree)
|
||||
data.tree->add_to_group(p_identifier,this);
|
||||
SceneTree::Group *gptr=NULL;
|
||||
if (data.tree) {
|
||||
gd.group=data.tree->add_to_group(p_identifier,this);
|
||||
} else {
|
||||
gd.group=NULL;
|
||||
}
|
||||
|
||||
gd.persistent=p_persistent;
|
||||
|
||||
|
|
@ -1207,14 +1211,15 @@ void Node::remove_from_group(const StringName& p_identifier) {
|
|||
|
||||
ERR_FAIL_COND(!data.grouped.has(p_identifier) );
|
||||
|
||||
GroupData *g=data.grouped.getptr(p_identifier);
|
||||
|
||||
ERR_FAIL_COND(!g);
|
||||
Map< StringName, GroupData>::Element *E=data.grouped.find(p_identifier);
|
||||
|
||||
ERR_FAIL_COND(!E);
|
||||
|
||||
if (data.tree)
|
||||
data.tree->remove_from_group(p_identifier,this);
|
||||
data.tree->remove_from_group(E->key(),this);
|
||||
|
||||
data.grouped.erase(p_identifier);
|
||||
data.grouped.erase(E);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -1232,13 +1237,11 @@ Array Node::_get_groups() const {
|
|||
|
||||
void Node::get_groups(List<GroupInfo> *p_groups) const {
|
||||
|
||||
const StringName *K=NULL;
|
||||
|
||||
while ((K=data.grouped.next(K))) {
|
||||
|
||||
for (const Map< StringName, GroupData>::Element *E=data.grouped.front();E;E=E->next()) {
|
||||
GroupInfo gi;
|
||||
gi.name=*K;
|
||||
gi.persistent=data.grouped[*K].persistent;
|
||||
gi.name=E->key();
|
||||
gi.persistent=E->get().persistent;
|
||||
p_groups->push_back(gi);
|
||||
}
|
||||
|
||||
|
|
@ -1246,16 +1249,16 @@ void Node::get_groups(List<GroupInfo> *p_groups) const {
|
|||
|
||||
bool Node::has_persistent_groups() const {
|
||||
|
||||
const StringName *K=NULL;
|
||||
|
||||
while ((K=data.grouped.next(K))) {
|
||||
|
||||
if (data.grouped[*K].persistent)
|
||||
for (const Map< StringName, GroupData>::Element *E=data.grouped.front();E;E=E->next()) {
|
||||
if (E->get().persistent)
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
|
||||
|
||||
}
|
||||
void Node::_print_tree(const Node *p_node) {
|
||||
|
||||
|
|
|
|||
|
|
@ -64,6 +64,7 @@ private:
|
|||
struct GroupData {
|
||||
|
||||
bool persistent;
|
||||
SceneTree::Group *group;
|
||||
GroupData() { persistent=false; }
|
||||
};
|
||||
|
||||
|
|
@ -91,7 +92,7 @@ private:
|
|||
Viewport *viewport;
|
||||
|
||||
|
||||
HashMap< StringName, GroupData,StringNameHasher> grouped;
|
||||
Map< StringName, GroupData> grouped;
|
||||
List<Node*>::Element *OW; // owned element
|
||||
List<Node*> owned;
|
||||
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ void SceneTree::node_removed(Node *p_node) {
|
|||
}
|
||||
|
||||
|
||||
void SceneTree::add_to_group(const StringName& p_group, Node *p_node) {
|
||||
SceneTree::Group *SceneTree::add_to_group(const StringName& p_group, Node *p_node) {
|
||||
|
||||
Map<StringName,Group>::Element *E=group_map.find(p_group);
|
||||
if (!E) {
|
||||
|
|
@ -73,10 +73,12 @@ void SceneTree::add_to_group(const StringName& p_group, Node *p_node) {
|
|||
|
||||
if (E->get().nodes.find(p_node)!=-1) {
|
||||
ERR_EXPLAIN("Already in group: "+p_group);
|
||||
ERR_FAIL();
|
||||
ERR_FAIL_V(&E->get());
|
||||
}
|
||||
E->get().nodes.push_back(p_node);
|
||||
E->get().last_tree_version=0;
|
||||
//E->get().last_tree_version=0;
|
||||
E->get().changed=true;
|
||||
return &E->get();
|
||||
}
|
||||
|
||||
void SceneTree::remove_from_group(const StringName& p_group, Node *p_node) {
|
||||
|
|
@ -125,7 +127,7 @@ void SceneTree::_flush_ugc() {
|
|||
|
||||
void SceneTree::_update_group_order(Group& g) {
|
||||
|
||||
if (g.last_tree_version==tree_version)
|
||||
if (!g.changed)
|
||||
return;
|
||||
if (g.nodes.empty())
|
||||
return;
|
||||
|
|
@ -135,7 +137,8 @@ void SceneTree::_update_group_order(Group& g) {
|
|||
|
||||
SortArray<Node*,Node::Comparator> node_sort;
|
||||
node_sort.sort(nodes,node_count);
|
||||
g.last_tree_version=tree_version;
|
||||
g.changed=false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -148,8 +151,6 @@ void SceneTree::call_group(uint32_t p_call_flags,const StringName& p_group,const
|
|||
if (g.nodes.empty())
|
||||
return;
|
||||
|
||||
_update_group_order(g);
|
||||
|
||||
|
||||
if (p_call_flags&GROUP_CALL_UNIQUE && !(p_call_flags&GROUP_CALL_REALTIME)) {
|
||||
|
||||
|
|
@ -175,6 +176,8 @@ void SceneTree::call_group(uint32_t p_call_flags,const StringName& p_group,const
|
|||
return;
|
||||
}
|
||||
|
||||
_update_group_order(g);
|
||||
|
||||
Vector<Node*> nodes_copy = g.nodes;
|
||||
Node **nodes = &nodes_copy[0];
|
||||
int node_count=nodes_copy.size();
|
||||
|
|
|
|||
|
|
@ -76,8 +76,9 @@ private:
|
|||
struct Group {
|
||||
|
||||
Vector<Node*> nodes;
|
||||
uint64_t last_tree_version;
|
||||
Group() { last_tree_version=0; };
|
||||
//uint64_t last_tree_version;
|
||||
bool changed;
|
||||
Group() { changed=false; };
|
||||
};
|
||||
|
||||
Viewport *root;
|
||||
|
|
@ -135,7 +136,7 @@ private:
|
|||
void _flush_ugc();
|
||||
void _flush_transform_notifications();
|
||||
|
||||
void _update_group_order(Group& g);
|
||||
_FORCE_INLINE_ void _update_group_order(Group& g);
|
||||
void _update_listener();
|
||||
|
||||
Array _get_nodes_in_group(const StringName& p_group);
|
||||
|
|
@ -162,7 +163,7 @@ friend class Node;
|
|||
void node_removed(Node *p_node);
|
||||
|
||||
|
||||
void add_to_group(const StringName& p_group, Node *p_node);
|
||||
Group* add_to_group(const StringName& p_group, Node *p_node);
|
||||
void remove_from_group(const StringName& p_group, Node *p_node);
|
||||
|
||||
void _notify_group_pause(const StringName& p_group,int p_notification);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue