Serve replay playback from a cached analysis result
Replay re-ran the SDK chain on every seek; Part A's pass stores the flow samples once. Opening a recording now reuses a compatible result or runs the pass behind a progress/cancel surface, and one cursor with two modes (recorded CSV, analysed) feeds the charts, the 2D canvas and the 3D pane by frame id. A threshold, colour or idle-dot change redraws from the stored frames and writes nothing; a cancelled pass is reported and never played. Verified: apps/studio/tests 440 items / 0 failed / 18 skipped (15 new, no existing assertion changed); shared 417 / 0 / 1; autocal 358.
This commit is contained in:
@@ -155,7 +155,8 @@
|
||||
"units_newton": "Newton",
|
||||
"units_raw": "Raw",
|
||||
"settings": "Settings",
|
||||
"settings_tip": "Show or hide the unit, record-mode and preview controls"
|
||||
"settings_tip": "Show or hide the unit, record-mode and preview controls",
|
||||
"stopped_analysis": "analysis"
|
||||
},
|
||||
"units": {
|
||||
"newton_short": "N",
|
||||
@@ -218,7 +219,10 @@
|
||||
"mesh3d_rejected": "The 3D scene was refused: {message}\nOnly the 3D view is affected; measuring, recording and the charts work as usual.",
|
||||
"mesh3d_unavailable_gl_reason": "3D is not available on this machine: {reason}\nMeasuring, recording and the charts work as usual.",
|
||||
"mesh3d_settings_tip": "3D display settings (view, housing, colour scale, frame rate)",
|
||||
"mesh3d_reset_tip": "Reset view: back to the framing the scene itself uses"
|
||||
"mesh3d_reset_tip": "Reset view: back to the framing the scene itself uses",
|
||||
"analysis_pipeline": "Analysis result (one finished pass)",
|
||||
"analysis_pipeline_tip": "This frame's arrows come from a stored analysis result rather than a chain running now; changing the threshold only changes which stored samples count as active.",
|
||||
"analysis_empty": "the analysis result holds no frame here"
|
||||
},
|
||||
"chart": {
|
||||
"fn": "FN",
|
||||
@@ -278,7 +282,16 @@
|
||||
"warn_config_missing": "no config hash was recorded, so recomputation cannot be verified",
|
||||
"warn_rows_skipped": "some unparsable CSV rows were skipped",
|
||||
"warn_frames_dropped": "frames were lost to a full queue; only their index rows remain (shown as \"not recorded\")",
|
||||
"warn_out_of_order": "this recording was written by an older version: its rows are not in time order, so the replay re-sorts them and window edges may differ"
|
||||
"warn_out_of_order": "this recording was written by an older version: its rows are not in time order, so the replay re-sorts them and window edges may differ",
|
||||
"analysis_empty": "this analysis result holds no frame to show",
|
||||
"analysis_unreadable": "this frame cannot be read ({error})",
|
||||
"analysis_complete": "replaying from the analysis result: {frames} frames, cursor on signal time (the recording's own frames.csv)",
|
||||
"analysis_reused": "an analysis result was already stored and is being replayed: {frames} frames",
|
||||
"analysis_failed": "the analysis did not finish ({reason}): playback is not served. Re-run it, or turn 「从视频重算」 off to read the recorded forces.csv",
|
||||
"analysis_cancelled": "the analysis was cancelled: no complete result was written, so no playback is served",
|
||||
"analysis_no_source": "this recording has no video segment to analyse",
|
||||
"analysis_busy": "an analysis is already running: wait for it, or cancel it",
|
||||
"analysis_grid_mismatch": "the current display settings moved the sample grid ({keys}); the stored candidate locations cannot serve it, so the replay keeps drawing the result's own grid"
|
||||
},
|
||||
"record": {
|
||||
"label": "Record",
|
||||
@@ -497,6 +510,27 @@
|
||||
"severity_info": "Note",
|
||||
"severity_warning": "Warning",
|
||||
"severity_error": "Error",
|
||||
"stats": "shown {displayed} · display drops {dropped} · compose {compose} ms · paint {paint} ms"
|
||||
"stats": "shown {displayed} · display drops {dropped} · compose {compose} ms · paint {paint} ms",
|
||||
"source_analysis": "Analysis result: one finished pass, read by frame",
|
||||
"source_analysis_tip": "The picture comes from a stored analysis result: the chain has already run and its output is on disk, so scrubbing and playing are file reads. Changing a threshold or a colour does not recompute."
|
||||
},
|
||||
"analysis": {
|
||||
"title": "Analysing the recording",
|
||||
"subtitle": "once only: scrubbing, playing and stepping afterwards are reads",
|
||||
"stage_open": "open chain",
|
||||
"stage_frames": "frame by frame",
|
||||
"stage_write": "write result",
|
||||
"frames": "{written} / {expected} frames",
|
||||
"segment": "segment {index} / {count}",
|
||||
"elapsed": "{seconds:.1f} s elapsed",
|
||||
"cancel": "Cancel",
|
||||
"cancelling": "Cancelling…",
|
||||
"cancel_tip": "Cancel this pass: the frames already written stay, but the result is marked incomplete and is never played back as if it were whole",
|
||||
"reused": "a stored result is already there — nothing to recompute",
|
||||
"complete": "analysis finished: {frames} frames in {seconds:.1f} s",
|
||||
"cancelled": "analysis cancelled ({frames} frames written; the result is marked incomplete)",
|
||||
"failed": "analysis failed: {reason}",
|
||||
"incomplete": "the result is incomplete: {reason}",
|
||||
"blocked": "a session is running: stop it before analysing"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user