You've already forked godot
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:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user