Skip to content

Commit 2387f13

Browse files
committed
perf: optimized spectrogram rendering pipeline
1 parent a96e95c commit 2387f13

5 files changed

Lines changed: 56 additions & 16 deletions

File tree

CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,25 @@
22

33
Starting from v2.2.5, all notable changes to this project will be documented in this file.
44

5+
## v4.3.3
6+
7+
### Release Notes
8+
9+
This is a **minor performance and stability release** focused on **UI responsiveness** and **upgrade robustness**.
10+
11+
The main highlight is **spectrogram rendering optimization**, significantly improving smoothness and reducing frame drops during real-time visualization. In addition, several **upgrade and startup edge cases** have been tightened to avoid misleading states and permission-related failures.
12+
13+
### Improvements
14+
15+
- Optimized **spectrogram rendering pipeline**, improving **frame rate and interaction smoothness** during real-time display.
16+
- Reduced unnecessary redraws in the frontend, lowering CPU usage under continuous data streams.
17+
18+
### Bug Fixes
19+
20+
- Fixed **upgrade status priority logic**, ensuring correct status reporting when multiple upgrade conditions overlap.
21+
- Added **write permission checks before startup** to prevent silent failures during initialization.
22+
- Explicitly specified **HTTPS scheme in CSP sources**, avoiding mixed-content and policy resolution issues in some browsers.
23+
524
## v4.3.2
625

726
### Release Notes

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CURRENT_VERSION_MAJOR = 4
22
CURRENT_VERSION_MINOR = 3
3-
CURRENT_VERSION_PATCH = 2
3+
CURRENT_VERSION_PATCH = 3
44

55
REQUIRED_VERSION_MAJOR = 4
66
REQUIRED_VERSION_MINOR = 3

web/src/src/components/chart/DequeSpectrogram.tsx

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -121,19 +121,30 @@ export const DequeSpectrogram = memo(
121121

122122
const timeRangeRef = useRef<[number, number]>([0, 0.001]);
123123
useEffect(() => {
124-
const renderLoop = setInterval(() => {
124+
let rafId: number;
125+
let lastRenderTime = 0;
126+
const frameInterval = 1000 / renderFPS;
127+
const renderLoop = (now: number) => {
128+
rafId = requestAnimationFrame(renderLoop);
129+
130+
if (now - lastRenderTime < frameInterval) {
131+
return;
132+
}
133+
lastRenderTime = now;
134+
125135
const canvas = canvasRef.current;
126-
if (!canvas || !spectrogramRef.current || !initialized) {
136+
const sp = spectrogramRef.current;
137+
if (!canvas || !sp || !initialized) {
127138
return;
128139
}
129140
if (needsUpdateRef.current) {
130141
needsUpdateRef.current = false;
131142
const bufData = bufferRef.current
132143
.getData()
133144
.filter((v): v is [number, number] => v[1] !== null);
134-
spectrogramRef.current.setData(bufData);
145+
sp.setData(bufData);
135146
if (bufData.length > 0) {
136-
const end = spectrogramRef.current.getDuration();
147+
const end = sp.getDuration();
137148
timeRangeRef.current = [end - duration, end];
138149
}
139150
}
@@ -142,16 +153,17 @@ export const DequeSpectrogram = memo(
142153
if (!width || !height) {
143154
return;
144155
}
145-
spectrogramRef.current.render({
156+
sp.render({
146157
timeRange: timeRangeRef.current,
147158
canvas,
148159
width,
149160
height,
150161
freqRange
151162
});
152-
}, 1000 / renderFPS);
153-
return () => clearInterval(renderLoop);
154-
}, [duration, freqRange, initialized, renderFPS, spectrogramRef]);
163+
};
164+
rafId = requestAnimationFrame(renderLoop);
165+
return () => cancelAnimationFrame(rafId);
166+
}, [duration, freqRange, initialized, renderFPS]);
155167

156168
const handlePreviewMinDB = useCallback((value: number) => {
157169
setMinDBState(value);

web/src/src/components/chart/Spectrogram.tsx

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ export const Spectrogram = memo(
8181
return () => ro.disconnect();
8282
}, []);
8383

84-
const [timePercent, setTimePercent] = useState(0);
84+
const [timePercent, setTimePercent] = useState(0.5);
8585
const dataDuration = useMemo<number | null>(() => {
8686
if (data.length === 0) {
8787
return null;
@@ -94,7 +94,16 @@ export const Spectrogram = memo(
9494
return;
9595
}
9696

97-
const id = setInterval(() => {
97+
let rafId: number;
98+
let lastRenderTime = 0;
99+
const frameInterval = 1000 / renderFPS;
100+
101+
const renderLoop = (now: number) => {
102+
rafId = requestAnimationFrame(renderLoop);
103+
if (now - lastRenderTime < frameInterval) {
104+
return;
105+
}
106+
lastRenderTime = now;
98107
const canvas = canvasRef.current;
99108
const sp = spectrogramRef.current;
100109
if (!canvas || !sp) {
@@ -118,10 +127,10 @@ export const Spectrogram = memo(
118127
timeRange: [start, end],
119128
freqRange
120129
});
121-
}, 1000 / renderFPS);
122-
123-
return () => clearInterval(id);
124-
}, [data, dataDuration, duration, freqRange, initialized, renderFPS, timePercent]);
130+
};
131+
rafId = requestAnimationFrame(renderLoop);
132+
return () => cancelAnimationFrame(rafId);
133+
}, [dataDuration, duration, freqRange, initialized, renderFPS, timePercent]);
125134

126135
useEffect(() => {
127136
if (initialized) {

web/src/src/views/History/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ const History = ({ currentLocale }: IRouterComponent) => {
392392

393393
const getInitialLayout = useCallback(
394394
(id: string, index: number) => {
395-
if (config[id]?.position && config[id]?.size) {
395+
if (config[id]?.position && config[id]?.size && config[id]?.spectrogram) {
396396
return config[id];
397397
}
398398

0 commit comments

Comments
 (0)