multicam: throttle angle refresh, shrink pre-render window

- MulticamPanel: playback angle refresh runs one cycle per 3 ticks
  instead of re-requesting every source every tick — each angle decode
  is a keyframe-scanning FFmpeg seek that stole worker capacity from
  the main viewer
- PreRender frames default 120 -> 12: a window larger than what the
  pool can render in real time queues far ahead of the playhead, so
  the painted frame lags seconds behind (playback frozen); a smaller
  window keeps the backlog bounded
- render_graph_frame: OAK_PERF clip-level timing
This commit is contained in:
2026-09-01 21:52:56 +08:00
parent 7f41570596
commit be42620e22
3 changed files with 49 additions and 8 deletions
+14 -1
View File
@@ -1304,11 +1304,21 @@ pub fn render_graph_frame(
let mut perf_collect = perf.then(std::time::Instant::now);
let mut perf_collect_ms = 0.0f64;
let mut frames: Vec<Frame> = Vec::new();
for clip in clips {
let mut perf_clip_hist: Vec<(oak_node::id::NodeId, f64)> = Vec::new();
for clip in clips.clone() {
let clip_sw = perf.then(std::time::Instant::now);
let request = oak_node::traverser::EvalRequest::new(clip, time);
let table = traverser.evaluate(graph, &request, &mut hooks).map_err(|e| {
Error::Failed(format!("graph evaluation of clip {clip:?} failed: {e:?}"))
})?;
if perf {
perf_clip_hist.push((
clip,
clip_sw
.map(|t| t.elapsed().as_secs_f64() * 1000.0)
.unwrap_or(0.0),
));
}
if let Some(t0) = &perf_collect {
perf_collect_ms += t0.elapsed().as_secs_f64() * 1000.0;
perf_collect = Some(std::time::Instant::now());
@@ -1337,6 +1347,9 @@ pub fn render_graph_frame(
let composite_ms = composite_started
.map(|t| t.elapsed().as_secs_f64() * 1000.0)
.unwrap_or(0.0);
for (clip, ms) in &perf_clip_hist {
eprintln!("[perf] clip {clip:?} evaluate {ms:.1}ms");
}
eprintln!(
"[perf] graph frame time {time:?} size {size:?}: evaluate {perf_collect_ms:.1}ms composite {composite_ms:.1}ms total {}ms",
perf_collect_ms + composite_ms