Fix unnecessary modifier visibility re-evaluation

While it is hard to measure the performance impact accurately, there
is no need to perform per-modifier string lookup on every frame update.

Implemented as an exceptional case in the code which flushes updates to
the entire component. Sounds a bit suboptimal, but there are already
other exception cases handled in the function.

Differential Revision: https://developer.blender.org/D15812
This commit is contained in:
Sergey Sharybin 2022-08-30 16:25:27 +02:00
parent c1e342136d
commit 5a1b733a67
1 changed files with 11 additions and 0 deletions

View File

@ -129,7 +129,18 @@ inline void flush_handle_component_node(IDNode *id_node,
*
* TODO(sergey): Make this a more generic solution. */
if (!ELEM(comp_node->type, NodeType::PARTICLE_SETTINGS, NodeType::PARTICLE_SYSTEM)) {
const bool is_geometry_component = comp_node->type == NodeType::GEOMETRY;
for (OperationNode *op : comp_node->operations) {
/* Special case for the visibility operation in the geometry component.
*
* This operation is a part of the geometry component so that manual tag for geometry recalc
* ensures that the visibility is re-evaluated. This operation is not to be re-evaluated when
* an update is flushed to the geometry component via a time dependency or a driver targeting
* a modifier. Skipping update in this case avoids CPU time unnecessarily spent looping over
* modifiers and looking up operations by name in the visibility evaluation function. */
if (is_geometry_component && op->opcode == OperationCode::VISIBILITY) {
continue;
}
op->flag |= DEPSOP_FLAG_NEEDS_UPDATE;
}
}