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
27 lines
766 B
C++
27 lines
766 B
C++
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
* Copyright 2022 Blender Foundation. All rights reserved. */
|
|
|
|
/** \file
|
|
* \ingroup depsgraph
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
struct Depsgraph;
|
|
|
|
namespace blender::deg {
|
|
|
|
struct Depsgraph;
|
|
struct IDNode;
|
|
|
|
/* Evaluate actual node visibility flags based on the current state of object's visibility
|
|
* restriction flags. */
|
|
void deg_evaluate_object_node_visibility(::Depsgraph *depsgraph, IDNode *id_node);
|
|
|
|
/* Flush both static and dynamic visibility flags from leaves up to the roots, making it possible
|
|
* to know whether a node has affect on something (potentially) visible. */
|
|
void deg_graph_flush_visibility_flags(Depsgraph *graph);
|
|
void deg_graph_flush_visibility_flags_if_needed(Depsgraph *graph);
|
|
|
|
} // namespace blender::deg
|