mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
perf(tr): устранение GUI-фриза ~100мс на TX→RX (живой TX-DSP поток)
TX-DSP поток (TTXDSPThread) больше не пересоздаётся на каждом T/R — он
создаётся один раз и живёт весь сеанс, на приём/передачу переключается
флагом FTXActive (поток при False просто Continue, не трогает канал/ring).
Тердаун перенесён в TWDSPEngine.Close. Раньше Terminate+WaitFor+Free на
каждом отпускании PTT давал фиксированные ~100мс пустого join-оверхеда
pthread_join, блокируя GUI-поток. Итог: 206→106мс, крупные фризы ушли.
Остаток ~106мс = плавный WDSP fade-out TXA (SetChannelState dmode=1) —
оставлен как есть (dmode=0 дал бы trailing key-click в эфир).
Попутно:
- MainForm: убраны прямые PbSpectrum.Invalidate из drag/wheel VFO/центра —
кадр рисует таймер по FSpectrumDirty (FPS-гейт; прямой Invalidate давал
GL-кадр на каждое событие мыши мимо гейта → треск в HDMI-звуке AMD APU).
- AudioOutput: const-секция после {$ENDIF} блока PA-констант.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+9
-13
@@ -1155,18 +1155,16 @@ begin
|
||||
rfVfoA:
|
||||
begin
|
||||
FreqDispA.Frequency := Round(FController.FVfoA);
|
||||
// Не рисуем синхронно из wheel/drag: частые события забивают UI-поток.
|
||||
// Invalidate лишь планирует; DrawSpectrum откладываем (FSpectrumDirty).
|
||||
// Линейку дёргаем сразу — её рендер дешёвый, иначе отстаёт от спектра.
|
||||
// Не рисуем синхронно из wheel/drag: частые события забивают UI-поток,
|
||||
// а мгновенный Invalidate давал GL-кадр на КАЖДОЕ событие мыши (при
|
||||
// драге рендер упирался в vsync и обходил FPS-гейт — на AMD APU это
|
||||
// трещало в HDMI-звуке того же GPU). Кадр отрисует ближайший тик
|
||||
// FSpectrumTimer по FSpectrumDirty. Линейка дешёвая — её сразу.
|
||||
SyncSpecViewFreq;
|
||||
FSpectrumDirty := True;
|
||||
PbSpectrum.Invalidate;
|
||||
if PbRuler <> nil then PbRuler.Invalidate;
|
||||
if FController.FLastVfoScrolled then
|
||||
begin
|
||||
FWaterfallDirty := True;
|
||||
if PbWaterfall <> nil then PbWaterfall.Invalidate;
|
||||
end;
|
||||
end;
|
||||
rfActiveVfo:
|
||||
begin
|
||||
@@ -1182,11 +1180,11 @@ begin
|
||||
rfCenterFreq:
|
||||
begin
|
||||
// CTUN-скролл центра (drag/web): ruler-метки сдвинулись → инвалидируем
|
||||
// кэш; спектр откладываем (FSpectrumDirty) — drag шлёт много событий.
|
||||
// кэш; спектр откладываем (FSpectrumDirty) — drag шлёт много событий,
|
||||
// кадр отрисует таймер (FPS-гейт, см. rfVfoA).
|
||||
FSpecView.InvalidateRulerCache;
|
||||
SyncSpecViewFreq;
|
||||
FSpectrumDirty := True;
|
||||
PbSpectrum.Invalidate;
|
||||
if PbRuler <> nil then PbRuler.Invalidate;
|
||||
end;
|
||||
rfVfoB:
|
||||
@@ -1196,8 +1194,7 @@ begin
|
||||
begin
|
||||
FSpecView.InvalidateRulerCache;
|
||||
SyncSpecViewFreq;
|
||||
FSpectrumDirty := True;
|
||||
PbSpectrum.Invalidate;
|
||||
FSpectrumDirty := True; // кадр — по таймеру (FPS-гейт, см. rfVfoA)
|
||||
if PbRuler <> nil then PbRuler.Invalidate;
|
||||
end;
|
||||
end;
|
||||
@@ -4568,8 +4565,7 @@ begin
|
||||
FController.SetSliceTarget(FSliceDragId, NewHz);
|
||||
PushSliceFlagState(FSliceDragId); // обновить частоту во флаге
|
||||
PositionSliceFlags;
|
||||
FSpectrumDirty := True;
|
||||
PbSpectrum.Invalidate;
|
||||
FSpectrumDirty := True; // кадр — по таймеру (FPS-гейт, как при drag VFO)
|
||||
end;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
Reference in New Issue
Block a user