Fix T99733: Objects with driven visibility are evaluated when not needed
The issue was caused by the fact that objects with driven or animated visibility were considered visible by the dependency graph evaluation. This change makes it so the dependency graph evaluation is aware of visibility which might be changing. This is achieved by evaluating the path of the graph which affects objects visibility and adjusts to it before evaluating the rest of the graph. There is some time penalty to this, but there does not seem to be a way to fully avoid this penalty. With the production shot from the heist project the FPS drops by a tenth of a frame (~9.4 vs ~9.3 fps) when adding a driver to an object which keeps it visible. Note that this is a bit hard to measure since the FPS fluctuates quite a bit throughout the playback. On the other hand, having a driver on a visibility of a heavy object from character and setting visibility to false gives big speedup. Also worth noting that there is no penalty at all when there are no animated visibilities in the scene. Differential Revision: https://developer.blender.org/D15498
This commit is contained in:
@@ -69,7 +69,8 @@ void IDNode::init(const ID *id, const char *UNUSED(subdata))
|
||||
customdata_masks = DEGCustomDataMeshMasks();
|
||||
previous_customdata_masks = DEGCustomDataMeshMasks();
|
||||
linked_state = DEG_ID_LINKED_INDIRECTLY;
|
||||
is_directly_visible = true;
|
||||
is_visible_on_build = true;
|
||||
is_enabled_on_eval = true;
|
||||
is_collection_fully_expanded = false;
|
||||
has_base = false;
|
||||
is_user_modified = false;
|
||||
@@ -138,8 +139,8 @@ string IDNode::identifier() const
|
||||
BLI_snprintf(orig_ptr, sizeof(orig_ptr), "%p", id_orig);
|
||||
BLI_snprintf(cow_ptr, sizeof(cow_ptr), "%p", id_cow);
|
||||
return string(nodeTypeAsString(type)) + " : " + name + " (orig: " + orig_ptr +
|
||||
", eval: " + cow_ptr + ", is_directly_visible " +
|
||||
(is_directly_visible ? "true" : "false") + ")";
|
||||
", eval: " + cow_ptr + ", is_visible_on_build " +
|
||||
(is_visible_on_build ? "true" : "false") + ")";
|
||||
}
|
||||
|
||||
ComponentNode *IDNode::find_component(NodeType type, const char *name) const
|
||||
@@ -188,7 +189,7 @@ IDComponentsMask IDNode::get_visible_components_mask() const
|
||||
{
|
||||
IDComponentsMask result = 0;
|
||||
for (ComponentNode *comp_node : components.values()) {
|
||||
if (comp_node->affects_directly_visible) {
|
||||
if (comp_node->possibly_affects_visible_id) {
|
||||
const int component_type_as_int = static_cast<int>(comp_node->type);
|
||||
BLI_assert(component_type_as_int < 64);
|
||||
result |= (1ULL << component_type_as_int);
|
||||
|
||||
Reference in New Issue
Block a user