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:
- Processing only keyframes with full SDXL diffusion (every N frames)
- Propagating keyframe content to in-between frames using motion vectors
- Blending bidirectionally from surrounding keyframes for seamless transitions
- 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
- Switch to Sequence Mode in the Input tab
- Select your image sequence folder
- Go to the Temporal tab
- Check Enable Temporal Propagation
- Adjust settings as needed (defaults work well for most cases)
- 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 mapsnormals_####.exr- Surface normalsmotion_####.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 |
Recommended Presets
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
- Sequence Processing Guide - Temporal noise strategies
- Pipeline Guide - SDXL pipeline details
- Exporting Sequences - Video export options
- Troubleshooting - Common issues
Last Updated: 2026-01-18 | Temporal Propagation v1.0