Temporal Propagation

Guide to keyframe-based rendering for stable, flicker-free animations

Last updated: 2026-01-18

Temporal Propagation

Temporal Propagation is an advanced rendering technique that dramatically improves animation quality while reducing render times. It uses intelligent keyframe-based processing to create smooth, flicker-free sequence animations.

Overview

The Problem

When processing image sequences with diffusion models, each frame is rendered independently. This causes:

  • Temporal flickering: Different noise patterns create inconsistent results between frames
  • Style drift: Slight variations in AI interpretation cause visual instability
  • Long render times: Every frame requires full SDXL diffusion processing

The Solution

Temporal Propagation solves these issues by:

  1. Processing only keyframes with full SDXL diffusion (every N frames)
  2. Propagating keyframe content to in-between frames using motion vectors
  3. Blending bidirectionally from surrounding keyframes for seamless transitions
  4. Repairing low-confidence areas with targeted inpainting

Result: ~2-3x faster rendering with dramatically improved temporal stability.


Requirements

Temporal Propagation is available when:

Requirement Value
Pipeline SDXL only
Input Mode Sequence mode
Tab Location Temporal tab (after LoRA)

Note: The Temporal tab only appears when using the SDXL pipeline. Other pipelines (SD3.5, Flux) do not currently support this feature.


Quick Start

  1. Switch to Sequence Mode in the Input tab
  2. Select your image sequence folder
  3. Go to the Temporal tab
  4. Check Enable Temporal Propagation
  5. Adjust settings as needed (defaults work well for most cases)
  6. Start processing

Settings Reference

Enable Temporal Propagation

The master toggle for the feature. When disabled, all frames are processed with full SDXL diffusion (standard behavior).


Keyframe Settings

Keyframe Interval

Range: 2 - 48 frames Default: 8 frames

How many frames between full SDXL keyframe renders.

Interval Quality Speed Use Case
2-4 Highest Slower Fast motion, complex scenes
6-8 High Balanced Recommended for most content
12-16 Medium Fast Slow motion, simple scenes
24-48 Lower Very Fast Static scenes, quick previews

How it works: Frame 0, 8, 16, 24... get full SDXL processing. Frames 1-7, 9-15, etc. are generated by propagating content from surrounding keyframes.

Keyframe Strength

Range: 0.10 - 1.00 Default: 0.45

The diffusion strength applied to keyframe renders. This is the same as the standard "Strength" parameter but applied only to keyframes.

Strength Effect
0.1 - 0.3 Subtle enhancement, preserves original closely
0.4 - 0.6 Moderate stylization (recommended)
0.7 - 1.0 Heavy transformation

Propagation Settings

Propagation Mode

Choose how in-between frames are generated:

Latent Space (Default) - Operates in SDXL's latent space - Smoother blending between keyframes - Requires VAE encoding/decoding - Better for subtle motion

Pixel Space - Operates directly on pixel data - Sharper results, EbSynth-like quality - No VAE overhead - Better for complex motion

Mode Smoothness Sharpness Speed Best For
Latent Higher Medium Medium Cinematic, slow motion
Pixel Medium Higher Faster Action, complex motion

Motion Source

How motion vectors are obtained for frame warping:

Auto (Default) - Uses EXR motion vectors if available in guidance folder - Falls back to computed optical flow - Best of both worlds

EXR Only - Requires motion vector EXR files from Unreal Engine - Most accurate for CG renders - Fails if EXR data not available

Optical Flow Only - Computes motion vectors from frame pairs - Works with any footage - ~300ms overhead per frame

None - Time-based blending only (no warping) - Fastest but lower quality - For static or near-static content

Guidance Folder (EXR)

Default: Empty (disabled)

Path to folder containing EXR guidance data from Unreal Engine:

  • depth_####.exr - Depth maps
  • normals_####.exr - Surface normals
  • motion_####.exr - Motion vectors

When provided, the system uses this data for more accurate propagation.

Use Depth Guidance

Default: Enabled

When enabled and EXR depth data is available, uses depth information to improve occlusion handling during warping.

Use Normal Guidance

Default: Enabled

When enabled and EXR normal data is available, uses surface normals to improve blending at edges.


Blending Settings

Bidirectional Blend

Default: Enabled

When enabled, in-between frames blend content from both the previous and next keyframes:

  • Frame 5 blends from keyframe 0 (backward) and keyframe 8 (forward)
  • Creates smoother transitions
  • Handles disocclusions better

When disabled, only forward propagation is used (faster but may show artifacts).

Blend Falloff

Default: Cosine

How blending weights are calculated for in-between frames:

Cosine (Recommended) - Smooth, natural falloff - Eases in/out near keyframes - Less visible transition points

Linear - Constant rate of change - May show subtle banding - Slightly faster to compute


Repair Settings

Repair handles areas where propagation produces low-confidence results (disocclusions, fast motion, etc.).

Repair Threshold

Range: 0.10 - 0.95 Default: 0.70

Confidence level below which triggers repair inpainting.

Threshold Effect
0.1 - 0.3 Aggressive repair (more inpainting)
0.5 - 0.7 Balanced (recommended)
0.8 - 0.95 Conservative (minimal repair)

Tip: Lower values = more repair passes. Use lower thresholds for content with lots of disocclusions.

Repair Strength

Range: 0.05 - 0.50 Default: 0.15

Diffusion strength for repair inpainting passes. Lower values preserve more of the propagated content.

Strength Effect
0.05 - 0.15 Subtle blending (recommended)
0.15 - 0.30 Moderate regeneration
0.30 - 0.50 Heavy regeneration

Repair ControlNet Strength

Range: 0.00 - 2.00 Default: 1.00

ControlNet conditioning strength during repair passes. Higher values keep repairs more consistent with surrounding content.


Configuration File

Temporal settings are stored in the temporal section of your .hextile.json config:

{
  "pipeline": "sdxl_inpaint",
  "input": {
    "mode": "sequence",
    "path": "D:/Sequences/MyProject"
  },
  "temporal": {
    "enabled": true,
    "keyframe_interval": 8,
    "keyframe_strength": 0.45,
    "propagation_mode": "latent",
    "motion_source": "auto",
    "guidance_folder": "",
    "use_depth": true,
    "use_normals": true,
    "repair_threshold": 0.7,
    "repair_strength": 0.15,
    "repair_controlnet_strength": 1.0,
    "bidirectional_blend": true,
    "blend_falloff": "cosine"
  }
}

Data Model Reference

Parameter Type Default Range Description
enabled boolean false - Master enable toggle
keyframe_interval integer 8 2-48 Frames between keyframes
keyframe_strength float 0.45 0.1-1.0 Diffusion strength for keyframes
propagation_mode string "latent" latent, pixel Warping space
motion_source string "auto" auto, exr, optical_flow, none Motion vector source
guidance_folder string "" path EXR guidance data folder
use_depth boolean true - Use depth for occlusion
use_normals boolean true - Use normals for blending
repair_threshold float 0.7 0.1-0.95 Confidence threshold for repair
repair_strength float 0.15 0.05-0.5 Repair diffusion strength
repair_controlnet_strength float 1.0 0.0-2.0 ControlNet strength for repair
bidirectional_blend boolean true - Blend from both directions
blend_falloff string "cosine" cosine, linear Blend weight curve

Fast Preview

Quick iteration for testing:

{
  "enabled": true,
  "keyframe_interval": 16,
  "keyframe_strength": 0.4,
  "propagation_mode": "pixel",
  "motion_source": "none",
  "bidirectional_blend": false
}

Balanced (Default)

Good quality with reasonable speed:

{
  "enabled": true,
  "keyframe_interval": 8,
  "keyframe_strength": 0.45,
  "propagation_mode": "latent",
  "motion_source": "auto",
  "bidirectional_blend": true,
  "blend_falloff": "cosine"
}

High Quality

Maximum quality for final exports:

{
  "enabled": true,
  "keyframe_interval": 4,
  "keyframe_strength": 0.5,
  "propagation_mode": "latent",
  "motion_source": "optical_flow",
  "bidirectional_blend": true,
  "blend_falloff": "cosine",
  "repair_threshold": 0.5,
  "repair_strength": 0.2
}

CG/Unreal Engine

For renders with EXR guidance data:

{
  "enabled": true,
  "keyframe_interval": 8,
  "propagation_mode": "latent",
  "motion_source": "exr",
  "guidance_folder": "D:/Project/EXR_Data",
  "use_depth": true,
  "use_normals": true
}

Performance Impact

Speed Comparison

For a 100-frame sequence with 44-tile template:

Mode Keyframes Rendered Propagated Frames Approx. Time Savings
Disabled 100 0 Baseline
Interval 8 13 87 ~60-70% faster
Interval 4 25 75 ~50-60% faster
Interval 16 7 93 ~70-80% faster

Note: Actual savings depend on propagation mode and repair frequency.

VRAM Usage

Temporal propagation adds minimal VRAM overhead:

  • Latent mode: +~500MB for VAE and latent cache
  • Pixel mode: +~200MB for frame buffers
  • Optical flow: +~300MB for flow computation

Troubleshooting

Visible seams between keyframes

Cause: Keyframe interval too high or bidirectional blend disabled Solution: - Reduce keyframe interval (try 4-6) - Enable bidirectional blend - Use cosine blend falloff

Ghosting or smearing artifacts

Cause: Motion estimation failing on fast motion Solution: - Reduce keyframe interval - Switch to optical_flow motion source - Enable repair with lower threshold (0.5)

Flickering still visible

Cause: Keyframes themselves are inconsistent Solution: - Use fixed seed in diffusion settings - Enable temporal noise strategy (frame_offset) in Diffusion tab - Increase keyframe strength slightly

Blurry in-between frames

Cause: Pixel mode with complex motion Solution: - Switch to latent propagation mode - Increase repair strength - Reduce keyframe interval

Out of memory errors

Cause: Latent cache filling up Solution: - Reduce keyframe interval (fewer cached keyframes) - Switch to pixel mode - Process sequence in smaller batches


Technical Architecture

Processing Flow

Frame N arrives
    │
    ├─ Is keyframe? (N % interval == 0)
    │   ├─ YES → Full SDXL diffusion → Cache output
    │   └─ NO → Propagation pipeline:
    │           ├─ Get surrounding keyframes
    │           ├─ Compute/load motion vectors
    │           ├─ Warp keyframe content
    │           ├─ Blend (bidirectional if enabled)
    │           ├─ Compute confidence mask
    │           └─ Repair low-confidence areas
    │
    └─ Output frame

Component Stack

Layer Component Purpose
Frontend TemporalTab.svelte User interface
Store render.ts State management
Backend API temporal.py Pydantic models
Orchestrator temporal_pipeline.py Sequence coordination
Core propagation.py Warping, blending, repair

Comparison with Temporal Noise

Temporal Propagation and Temporal Noise Strategies (in the Diffusion tab) are complementary features:

Feature Purpose When to Use
Temporal Noise Varies diffusion noise per frame Always for sequences
Temporal Propagation Reuses keyframe content When speed + stability matter

Best Practice: Enable both for optimal results: - Temporal Noise: frame_offset or slerp - Temporal Propagation: enabled: true


Next Steps


Last Updated: 2026-01-18 | Temporal Propagation v1.0

Esc
Searching...
No results found.
Type to search the documentation
Navigate Select Esc Close