draw optimization

This commit is contained in:
2026-03-06 12:29:36 +03:00
parent 19b4efea6b
commit 811c96b36c
2 changed files with 186 additions and 75 deletions
+19 -6
View File
@@ -359,10 +359,14 @@ begin
// ---- Шаг 1: создать анализатор ----
// success = 0 означает УСПЕХ (WDSP Guide p.119)
// m_size = максимальный FFT размер (должен быть степенью 2, ≤ 262144)
// ОПТИМИЗАЦИЯ: 262144 → 16384. WDSP аллоцирует и инициализирует twiddle-таблицы
// для ВСЕХ степеней 2 вплоть до m_size при каждом вызове XCreateAnalyzer.
// Реальный рабочий FFT = 4096, запас ×4 = 16384 достаточен для будущих апгрейдов.
// Эффект: время открытия WDSP ~10 сек → ~1 сек.
// m_LO = 1 (нет spur elimination)
// m_stitch = 1 (один sub-span)
Success := -1;
XCreateAnalyzer(DISP_ID, @Success, 262144, 1, 1, nil);
XCreateAnalyzer(DISP_ID, @Success, 16384, 1, 1, nil);
if Success <> 0 then
begin
// Анализатор не создан — работаем без спектра, краша не будет
@@ -443,7 +447,18 @@ begin
end;
try
// ОПТИМИЗАЦИЯ: Анализатор создаём ПЕРВЫМ — до OpenChannel.
// Это соответствует порядку piHPSDR и гарантирует что DISP_ID готов
// до того как DSP поток начнёт вызывать Spectrum0.
OpenAnalyzer;
// НЕ используем SetRXASpectrum — кормим анализатор вручную
// через Spectrum0 с Double буфером, чтобы избежать SIGSEGV
// (fexchange0 работает с Single, а внутри WDSP Spectrum2 ждёт Double)
// ---- RXA channel 0 ----
// ОПТИМИЗАЦИЯ: state=0 (не запускать сразу) — настраиваем все параметры
// вхолостую, только потом стартуем через SetChannelState.
// Канал не тратит CPU на обработку "мусорных" данных в процессе настройки.
OpenChannel(
RXA_CHAN,
FBufSize, // in_size @ FSampleRate (4096 @ 192kHz)
@@ -452,7 +467,7 @@ begin
FAudioRate, // dsp_rate = 48kHz
FAudioRate, // out_rate = 48kHz
0, // atype: 0=RX
1, // state: 1=run
0, // state: 0=hold (запустим после настройки всех параметров)
0.010, 0.010, 0.010, 0.010,
0
);
@@ -466,10 +481,8 @@ begin
SetRXAPanelSelect(RXA_CHAN, 3);
SetRXAPanelRun(RXA_CHAN, 1);
OpenAnalyzer;
// НЕ используем SetRXASpectrum — кормим анализатор вручную
// через Spectrum0 с Double буфером, чтобы избежать SIGSEGV
// (fexchange0 работает с Single, а внутри WDSP Spectrum2 ждёт Double)
// Запускаем RXA канал только после полной настройки
SetChannelState(RXA_CHAN, 1, 0); // run, no delay-wait
// ---- TXA channel 1 ----
OpenChannel(