Fix performance issue when tagging relations for update

The relations update code does tagging needed to ensure that the
array of bases is updated when relations are updated. It was done
by tagging the Scene ID node, and potentially recursing into all
dependent depsgraph nodes. If there is a driver on a scene property
it was unnecessarily re-evaluated.

This solves the slow behavior of adding objects in the test file
from #117335.

Pull Request: https://projects.blender.org/blender/blender/pulls/117403
This commit is contained in:
Sergey Sharybin 2024-01-22 12:27:55 +01:00 committed by Sergey Sharybin
parent 1903f58eac
commit 29aaa2922d
1 changed files with 11 additions and 7 deletions

View File

@ -281,15 +281,19 @@ void DEG_graph_tag_relations_update(Depsgraph *graph)
DEG_DEBUG_PRINTF(graph, TAG, "%s: Tagging relations for update.\n", __func__);
deg::Depsgraph *deg_graph = reinterpret_cast<deg::Depsgraph *>(graph);
deg_graph->need_update_relations = true;
/* NOTE: When relations are updated, it's quite possible that
* we've got new bases in the scene. This means, we need to
* re-create flat array of bases in view layer.
*
* TODO(sergey): Try to make it so we don't flush updates
* to the whole depsgraph. */
/* NOTE: When relations are updated, it's quite possible that we've got new bases in the scene.
* This means, we need to re-create flat array of bases in view layer. */
/* TODO(sergey): It is expected that bases manipulation tags scene for update to tag bases array
* for re-creation. Once it is ensured to happen from all places this implicit tag can be
* removed. */
deg::IDNode *id_node = deg_graph->find_id_node(&deg_graph->scene->id);
if (id_node != nullptr) {
id_node->tag_update(deg_graph, deg::DEG_UPDATE_SOURCE_RELATIONS);
graph_id_tag_update(deg_graph->bmain,
deg_graph,
&deg_graph->scene->id,
ID_RECALC_BASE_FLAGS,
deg::DEG_UPDATE_SOURCE_RELATIONS);
}
}