1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-15 13:51:40 +00:00

Massive speed up on deleting nodes, fixes #18673

Also makes the editor exit faster
This commit is contained in:
Juan Linietsky
2018-11-18 11:47:19 -03:00
parent 4a050568a2
commit 2d6b994e47
3 changed files with 50 additions and 34 deletions

View File

@@ -1941,30 +1941,30 @@ Object::~Object() {
memdelete(script_instance);
script_instance = NULL;
List<Connection> sconnections;
const StringName *S = NULL;
while ((S = signal_map.next(S))) {
while ((S = signal_map.next(NULL))) {
Signal *s = &signal_map[*S];
ERR_EXPLAIN("Attempt to delete an object in the middle of a signal emission from it");
ERR_CONTINUE(s->lock > 0);
for (int i = 0; i < s->slot_map.size(); i++) {
sconnections.push_back(s->slot_map.getv(i).conn);
if (s->lock) {
ERR_EXPLAIN("Attempt to delete an object in the middle of a signal emission from it");
ERR_CONTINUE(s->lock > 0);
}
//brute force disconnect for performance
int slot_count = s->slot_map.size();
const VMap<Signal::Target, Signal::Slot>::Pair *slot_list = s->slot_map.get_array();
for (int i = 0; i < slot_count; i++) {
slot_list[i].value.conn.target->connections.erase(slot_list[i].value.cE);
}
signal_map.erase(*S);
}
for (List<Connection>::Element *E = sconnections.front(); E; E = E->next()) {
Connection &c = E->get();
ERR_CONTINUE(c.source != this); //bug?
this->_disconnect(c.signal, c.target, c.method, true);
}
//signals from nodes that connect to this node
while (connections.size()) {
Connection c = connections.front()->get();