Jump to: Board index » General » Fusion

It's time to create a new Cache Node

Learn about 3D compositing, animation, broadcast design and VFX workflows.
  • Author
  • Message
Offline

bentheanimator

  • Posts: 50
  • Joined: Mon May 13, 2019 10:38 pm
  • Real Name: Ben Hall

It's time to create a new Cache Node

PostFri Mar 26, 2021 10:30 pm

The caching system in Fusion and reFusion is broken. I've been using this stuff for a few years now and use the Loader/Saver method when all else fails.

Before I get to the point of this. A couple of things that help Caching are this:

Add a SetDomain before your node you intend to Cache. This will limit the DoD to jsut what is seen on your frame and not try to compute the surrounding area off camera after your Cache has been created.

Ok really, that's the only one.

If that doesn't do it then use the Loader/Saver method, which incase you don't know is just making a Saver node then immediately making a Loader connected to the rest of the flow.
There is one variation that I like to use with this method because it's faster than an EXR sequence...
Set a Boolean node and name it Cache. Then cache the Bol BUT set the cache directory to something like "project/fuCached/BolCache/BolCache0000.raw"

YOU MUST LOCK YOUR CACHE OR YOU WILL LOOSE IT

After spending the last four months really getting into Houdini it is obvious that Caching is a big deal and Houdini did it right like so many other things that they implement. It has a File Cache Node. One node that looks like a Saver Node with one big exception...

There's a check box in the upper left corner that says Load Cache

It's that simple. Have the node save as ".raw" because it's super fast. Then let is load and disable save if the check box it enabled.

So let's move past the constant disappointment that is cache to disk. We've asked for it to be fixed for so long it might as well be remade from scratch. If Peter or anyone from the dev team reads this, you have an excellent product with some rough edges. Know that these kinds of requests come from wanting to smooth corners not because we hate you or your product. Resolve is actually my go to for making entire productions now. It just has some sore points like caching. I think this could help a lot.
Offline
User avatar

Chad Capeland

  • Posts: 2635
  • Joined: Mon Nov 10, 2014 9:40 pm

Re: It's time to create a new Cache Node

PostSat Mar 27, 2021 12:34 am

bentheanimator wrote:There is one variation that I like to use with this method because it's faster than an EXR sequence...
Set a Boolean node and name it Cache. Then cache the Bol BUT set the cache directory to something like "project/fuCached/BolCache/BolCache0000.raw"


Why doesn't Resolve's Saver node let you save out .raw files? It's seems to be crippled for no reason. Loaders are also arbitrarily crippled.

bentheanimator wrote:Add a SetDomain before your node you intend to Cache. This will limit the DoD to just what is seen on your frame and not try to compute the surrounding area off camera after your Cache has been created.


Do this carefully, though. If you clip the data window, anything that needs to sample outside that (which is a LOT of tools) will lose flexibility and/or quality.

.EXR and .RAW files can store data in the DoD, even if some or all of it is outside the display window. However, Fusion/Resolve do not utilize this.

Fortunately, you can use LifeSaver to save out the full data window and load that using a standard Loader.

See this example:

Code: Select all
{
   Tools = ordered() {
      Merge1 = Merge {
         Inputs = {
            Background = Input {
               SourceOp = "BrightnessContrast1",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "PipeRouter1",
               Source = "Output",
            },
            Center = Input { Value = { 0.497766177225449, 0.503960459102432 }, },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 1265, 82.5 } },
      },
      Transform2 = Transform {
         Inputs = {
            Center = Input { Value = { 1, 1 }, },
            Input = Input {
               SourceOp = "Merge1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 1430, 82.5 } },
      },
      Loader1 = Loader {
         Clips = {
            Clip {
               ID = "Clip1",
               Filename = "C:\\Users\\ccape\\AppData\\Local\\Temp\\Transform1_output_LifeSaver_0000.exr",
               FormatID = "OpenEXRFormat",
               LengthSetManually = true,
               TrimIn = 0,
               TrimOut = 0,
               ExtendFirst = 0,
               ExtendLast = 0,
               Loop = 1,
               AspectMode = 0,
               Depth = 0,
               TimeCode = 0,
               GlobalStart = 0,
               GlobalEnd = 0
            }
         },
         CtrlWZoom = false,
         Inputs = {
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            ["Clip1.OpenEXRFormat.RedName"] = Input { Value = FuID { "R" }, },
            ["Clip1.OpenEXRFormat.GreenName"] = Input { Value = FuID { "G" }, },
            ["Clip1.OpenEXRFormat.BlueName"] = Input { Value = FuID { "B" }, },
            ["Clip1.OpenEXRFormat.AlphaName"] = Input { Value = FuID { "A" }, },
         },
         ViewInfo = OperatorInfo { Pos = { 990, 49.5 } },
      },
      PipeRouter1 = PipeRouter {
         Inputs = {
            Input = Input {
               SourceOp = "Loader1",
               Source = "Output",
            },
         },
         ViewInfo = PipeRouterInfo { Pos = { 1045, 82.5 } },
      },
      BrightnessContrast1 = BrightnessContrast {
         Inputs = {
            Gain = Input { Value = 0, },
            Input = Input {
               SourceOp = "Blur1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 1210, 148.5 } },
      },
      Blur1 = Blur {
         Inputs = {
            XBlurSize = Input { Value = 3.4, },
            ClippingMode = Input { Value = FuID { "None" }, },
            Input = Input {
               SourceOp = "PipeRouter1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 1100, 148.5 } },
      },
      LifeSaver1 = Fuse.LifeSaver {
         Inputs = {
            ViewOutput = Input { Value = 0, },
            Filename = Input { Value = "Temp:\\Transform1_output_LifeSaver_.exr", },
            Version = Input { Value = "001", },
            UUID = Input { Value = "068eeecb-d093-4ca7-baeb-9326a9788f0b", },
            OutputFormat = Input { Value = 0, },
            SaveFrames = Input { Value = 0, },
            SetSequenceStart = Input { Value = 0, },
            SequenceStartFrame = Input { Value = 0, },
            CreateDir = Input { Value = 1, },
            CreateButton = Input { Value = 0, },
            Shell1 = Input { Value = "", },
            Shell2 = Input { Value = "", },
            Shell3 = Input { Value = "", },
            Shell4 = Input { Value = "", },
            Depth = Input { Value = 0, },
            Compression = Input { Value = 0, },
            PartNamePrefixToChannel = Input { Value = 0, },
            Export1 = Input { Value = 0, },
            Input1 = Input {
               SourceOp = "Transform1",
               Source = "Output",
            },
            RedEnable1 = Input { Value = 1, },
            GreenEnable1 = Input { Value = 1, },
            BlueEnable1 = Input { Value = 1, },
            AlphaEnable1 = Input { Value = 1, },
            ZEnable1 = Input { Value = 0, },
            CovEnable1 = Input { Value = 0, },
            ObjIDEnable1 = Input { Value = 0, },
            MatIDEnable1 = Input { Value = 0, },
            UEnable1 = Input { Value = 0, },
            VEnable1 = Input { Value = 0, },
            XNormEnable1 = Input { Value = 0, },
            YNormEnable1 = Input { Value = 0, },
            ZNormEnable1 = Input { Value = 0, },
            XVelEnable1 = Input { Value = 0, },
            YVelEnable1 = Input { Value = 0, },
            XRevVelEnable1 = Input { Value = 0, },
            YRevVelEnable1 = Input { Value = 0, },
            XPosEnable1 = Input { Value = 0, },
            YPosEnable1 = Input { Value = 0, },
            ZPosEnable1 = Input { Value = 0, },
            XDispEnable1 = Input { Value = 0, },
            YDispEnable1 = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 880, 49.5 } },
         Version = 106
      },
      Transform1 = Transform {
         Inputs = {
            Center = Input { Value = { 0, 0 }, },
            Input = Input {
               SourceOp = "Text1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 770, 82.5 } },
      },
      Text1 = TextPlus {
         Inputs = {
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            Size = Input { Value = 0.0406, },
            Font = Input { Value = "Open Sans", },
            StyledText = Input { Value = "i am smol.", },
            Style = Input { Value = "Light", },
            ManualFontKerningPlacement = Input {
               Value = StyledText {
                  Array = {
                  },
                  Value = ""
               },
            },
         },
         ViewInfo = OperatorInfo { Pos = { 550, 82.5 } },
      },
      Merge2 = Merge {
         Inputs = {
            Background = Input {
               SourceOp = "Background1",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "Transform2",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 1430, 214.5 } },
      },
      Background1 = Background {
         Inputs = {
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            TopLeftRed = Input { Value = 0.407, },
            TopLeftGreen = Input { Value = 0.407, },
            TopLeftBlue = Input { Value = 0.407, },
         },
         ViewInfo = OperatorInfo { Pos = { 550, 214.5 } },
      }
   }
}
Chad Capeland
Indicated, LLC
www.floweffects.com
Offline

bentheanimator

  • Posts: 50
  • Joined: Mon May 13, 2019 10:38 pm
  • Real Name: Ben Hall

Re: It's time to create a new Cache Node

PostMon Mar 29, 2021 6:59 pm

Yeah, I've found that the Set DoD thing is something I'll do if I'm creatively flying on a comp and I'm not concerned about it being clean as much as fast. My process for things these days is to start up Resolve and hash out a cut with the footage. Then identify what needs FX work and make compound clips for those pieces. Inside the Compound Clip I'll add a Fusion Composition from the Effects Library.

Once all that is straightened away it's on to adding in any EXR renders coming in from other programs with Loaders. What's weird is the whole Media In thing. I don't mind it for footage but I use Packed EXRs so it's a no go for half my stuff. Once I've got a decent slap comp put together, I tend to start caching branches and then make the call if I can stay in Resolve or move over to Fusion Stand Alone. Usually it's because of thing's like eating up too much RAM or needing to open the comp in text to do a find and replace on elements. Batch stuff. If they had a compatible Media In, it would make it a lot less painful to go between. At this point the slowest thing is having to relink Media In with Loaders in Fusion and the reverse.

I think they just need to add some new nodes in Fu and reFu and not worry about backwards compatibility. Resolve has proven itself to me and now is a central hub of production but isn't as nimble to throwing stuff around like you can with Stand Alone. Things like LifeSaver are indeed a life saver and they could just add that and a Caching Node without much work. I would love to see their roadmap for Fu and reFU. It seems stability is good now and actual features could be worked over. Like moving the pRender to GPU. That would help a lot.

I wish they had the Bin accessible. I've built up a little library template comps and effects with thumbnails that would be nice to use. Not to mention the original comps that are in the bin. Pipelines have been built and things like Deadline need to be considered. It's time to move past the lone editor market and get into making something that a whole shop can be built on. Which would be where this whole thing started with Eyeon so there's that.

Return to Fusion

Who is online

Users browsing this forum: Hendrik Proosa and 14 guests