Fix skipped realtime analyzer frames

This commit is contained in:
Mikei386
2026-08-05 15:26:56 +02:00
parent cef997d246
commit afcceec986
2 changed files with 22 additions and 3 deletions
+15 -3
View File
@@ -2634,6 +2634,7 @@ let prevSaverActive = false;
let audioRecoverInFlight = false;
let lastAudioRecoverAt = 0;
let renderDirty = true;
let renderRequestGeneration = 0;
let lastRenderedAudioSeq = 0;
let processingProfileDirty = true;
let appliedProcessingProfileView = '';
@@ -2642,6 +2643,7 @@ const DATA_ONLY_RENDER_REASONS = new Set(['audio', 'spectro', 'visuals']);
function requestRender(reason = 'ui') {
renderDirty = true;
renderRequestGeneration += 1;
if (!DATA_ONLY_RENDER_REASONS.has(reason)) processingProfileDirty = true;
env.__lastRenderReason = reason;
}
@@ -2686,7 +2688,14 @@ async function loop(now){
}
const targetMs = audioOk ? (1000 / desiredFpsForStyle(renderStyle)) : (1000 / 20);
const target = targetMs;
const currentAudioSeq = Number.isFinite(env.audio?.xySeq) ? env.audio.xySeq : 0;
const currentMetricsSeq = Number.isFinite(env.audio?.phoenixMetricsSeq)
? env.audio.phoenixMetricsSeq
: 0;
const currentVisualsSeq = Number.isFinite(env.audio?.phoenixVisualsSeq)
? env.audio.phoenixVisualsSeq
: 0;
const currentXySeq = Number.isFinite(env.audio?.xySeq) ? env.audio.xySeq : 0;
const currentAudioSeq = Math.max(currentMetricsSeq, currentVisualsSeq, currentXySeq);
const audioDirty = currentAudioSeq > lastRenderedAudioSeq;
const shouldRenderFrame =
renderDirty ||
@@ -2714,14 +2723,17 @@ async function loop(now){
}
prevSaverActive = saverActive;
if (!saverActive && shouldRenderFrame) {
const renderGeneration = renderRequestGeneration;
meterFacade.setFrameStamp?.(++frameCounter);
drawBG();
if (!currentView || currentViewId !== renderStyle) setView(renderStyle);
if (currentView.render) await currentView.render(env, viewState);
drawOptionsPanelBackdrop();
drawAudioLostOverlay();
renderDirty = false;
lastRenderedAudioSeq = currentAudioSeq;
// A packet or UI event can request another frame while the async view
// render is in progress. Do not erase that newer request here.
if (renderRequestGeneration === renderGeneration) renderDirty = false;
lastRenderedAudioSeq = Math.max(lastRenderedAudioSeq, currentAudioSeq);
}
} catch(e){
showErr('Render error: ' + (e?.message || String(e)));