Page MenuHome

Depsgraph: remove unused no-op nodes after building
ClosedPublic

Authored by Sybren A. Stüvel (sybren) on Mar 5 2020, 5:52 PM.

Details

Summary

This is the companion of D7031. That patch adds a new DIMENSIONS node to the depsgraph for each object that has geometry. However, this node is only necessary when there are drivers using an object's dimensions as variable. Since this is rare, it's easiest to remove these nodes after they turn out to be unnecessary. This is what (almost) happens in this patch.

Removing nodes from the depsgraph is hard, and there are no functions to do this yet. Instead, this patch recursively removes all the incoming relations from unused no-op nodes (i.e. no-op operation nodes without outgoing connections). Actually removing the nodes will be left as a future improvement.

I've tested this on a Spring file and it has no obvious performance impact on viewport playback.

Here are there results of blender --debug-depsgraph-time spring_02_055_A.eevee.blend and letting it run for a while to stabilise the reported FPS.

master: 11.7 FPS
Just D7031: 11.7 FPS
Just D7033: 11.8 FPS
Both D7031 + D7033: 12.3 FPS

Diff Detail

Repository
rB Blender
Branch
temp-depsgraph-remove-noop (branched from master)
Build Status
Buildable 6969
Build 6969: arc lint + arc unit

Event Timeline

This is quite measurable speedup.

My take on this: we should totally have some "simplification" "post-process" pass on the built graph, simply because it's not always easy to guarantee simplest possible graph "by-construction". So i would think there should be a file called something like deg_builder_remove_simplify.cc. which will do all the no-op optimizations, transitive reduction, removal of duplicated links and so on. Individual steps can be implemented in own files to keep top-level logic clear.

On another hand we can always rename files later on.

This revision is now accepted and ready to land.Mar 6 2020, 11:56 AM