Depsgraph: Avoid hash lookup for every evaluated scene query
Cache pointer to evaluated scene datablock on relations build time, that pointer never changes after that.
This commit is contained in:
@@ -102,7 +102,8 @@ Depsgraph::Depsgraph(Scene *scene,
|
|||||||
scene(scene),
|
scene(scene),
|
||||||
view_layer(view_layer),
|
view_layer(view_layer),
|
||||||
mode(mode),
|
mode(mode),
|
||||||
ctime(BKE_scene_frame_get(scene))
|
ctime(BKE_scene_frame_get(scene)),
|
||||||
|
scene_cow(NULL)
|
||||||
{
|
{
|
||||||
BLI_spin_init(&lock);
|
BLI_spin_init(&lock);
|
||||||
id_hash = BLI_ghash_ptr_new("Depsgraph id hash");
|
id_hash = BLI_ghash_ptr_new("Depsgraph id hash");
|
||||||
|
|||||||
@@ -197,6 +197,11 @@ struct Depsgraph {
|
|||||||
|
|
||||||
/* Time at which dependency graph is being or was last evaluated. */
|
/* Time at which dependency graph is being or was last evaluated. */
|
||||||
float ctime;
|
float ctime;
|
||||||
|
|
||||||
|
/* Evaluated version of datablocks we access a lot.
|
||||||
|
* Stored here to save us form doing hash lookup.
|
||||||
|
*/
|
||||||
|
Scene *scene_cow;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace DEG
|
} // namespace DEG
|
||||||
|
|||||||
@@ -260,6 +260,9 @@ void DEG_graph_build_from_view_layer(Depsgraph *graph,
|
|||||||
/* Relations are up to date. */
|
/* Relations are up to date. */
|
||||||
deg_graph->need_update = false;
|
deg_graph->need_update = false;
|
||||||
|
|
||||||
|
/* Store pointers to commonly used valuated datablocks. */
|
||||||
|
deg_graph->scene_cow = (Scene *)deg_graph->get_cow_id(°_graph->scene->id);
|
||||||
|
|
||||||
if (need_on_visible_update) {
|
if (need_on_visible_update) {
|
||||||
DEG_graph_on_visible_update(bmain, graph);
|
DEG_graph_on_visible_update(bmain, graph);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -105,9 +105,7 @@ Scene *DEG_get_evaluated_scene(const Depsgraph *graph)
|
|||||||
{
|
{
|
||||||
const DEG::Depsgraph *deg_graph =
|
const DEG::Depsgraph *deg_graph =
|
||||||
reinterpret_cast<const DEG::Depsgraph *>(graph);
|
reinterpret_cast<const DEG::Depsgraph *>(graph);
|
||||||
Scene *scene_orig = deg_graph->scene;
|
Scene *scene_cow = deg_graph->scene_cow;
|
||||||
Scene *scene_cow =
|
|
||||||
reinterpret_cast<Scene *>(deg_graph->get_cow_id(&scene_orig->id));
|
|
||||||
/* TODO(sergey): Shall we expand datablock here? Or is it OK to assume
|
/* TODO(sergey): Shall we expand datablock here? Or is it OK to assume
|
||||||
* that calleer is OK with just a pointer in case scene is not up[dated
|
* that calleer is OK with just a pointer in case scene is not up[dated
|
||||||
* yet?
|
* yet?
|
||||||
|
|||||||
Reference in New Issue
Block a user