Replies: 1 comment
-
|
In the course of creating AcademySoftwareFoundation/OpenCue#2180, I've taken a closer look at OpenCue's frame-level dependency modes. They are FrameByFrame, PreviousFrame, LayerOnSimFrame, and LayerOnAny. They're defined in the DependType class of pyoutline/outline/depend.py. FrameByFrameThis is like the "scene export -> frame render" example. LayerOnLayerThis is a dependency on another step, no per-task subspace. PreviousFrameThis is like the "simulation with uniform time steps -> render every Nth as an image" example, for the SimulateTimeStep self-dependency or an analogous dependency on a different step. LayerOnSimFrameBehavior defined by pyoutline/outline/backend/cue.py function build_dependencies. It takes the first frame of the dependency layer, and makes every frame of the current layer depend on that frame. My understanding for this is that the scene has a "cache sim" process implicit, that the first frame will perform, and you don't want a different layer to start until that is processed. Similar to LayerOnAny but just for the first frame. This is like the "simulation with uniform time steps -> render every Nth as an image" example, with a different dependency structure for how RenderFrame depends on SimulateTimeStep. LayerOnAnyStarts the layer when any frame of the dependency layer finishes. Similar to LayerOnSimFrame but for any frame not the first frame number. Created the example to illustrate this: scene where any frame creates sim cache -> render depends on the sim cache |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Render farms often support dependencies between two steps that divide per frame instead of being across all the the frames together. Open Job Description could support this by extending the representation of a step dependency. This idea requires #79 to be able to express many patterns by writing expressions.
OpenCue supports a LayerOnAny mode where any of the frames of the dependency unblock a layer instead of a specific frame or the whole layer. This is the inspiration for adding
anyOfandallOfoptionally in theparameterSubspace. The default would beallOfbehavior if the list is at theparameterSubspacelevel.Here are a few examples to try showing how a general syntax could work for a variety of different cases.
Example: scene export -> frame render.
Suppose you have a scene in Windows-only software, that supports export to a renderer that runs on Linux. You can structure this as a two-step job. Generally, when a frame is finished exporting, it should render immediately, not wait until all the frames are exported.
Example: simulation with uniform time steps -> render every Nth as an image
Suppose you have a simulation of a world defining its physics and perhaps agents within it. For each timestep, you take the state of the world at the previous timestep, and advance it. You can represent this as a chain of tasks, each one depending on the previous one. You could compose this with a per-timestep dependency
Example: Directed acyclic graph (DAG) uniform processing of a dataset.
Suppose you want to process your data set in a DAG, running the same processing at each node of that graph. You can structure this as a single-step job, with a self-dependency that holds a graph as a dependency list. There might be a better way to represent this, but this example needs an ARRAY[ARRAY[INT]] (or LIST[LIST[INT]], however #79 ends up) job parameter data type to accept the adjacency list as a parameter.
Example: scene where any frame creates sim cache -> render depends on the sim cache
Beta Was this translation helpful? Give feedback.
All reactions