From 1eecd974fc9cc33d36a91bfbd3afa32c06f27a8b Mon Sep 17 00:00:00 2001 From: Uladzimir Karpenka Date: Sun, 24 May 2026 18:51:41 +0300 Subject: [PATCH] Reduce timer-tick CPU load by removing per-tick ResizeSMeter and throttling AGC line updates - Remove ResizeSMeter (Pango font measurement + multiple SetBounds) from 60 Hz timer tick; it is still called on actual resize events - Throttle UpdateAGCLines WDSP API calls from 60 Hz to ~10 Hz (every 6 ticks) - Optimize spectrum alpha-fix loop: write-only byte access instead of read-modify-write DWORD Co-Authored-By: Claude Sonnet 4.6 --- MainForm.pas | 13 +++++++++---- SpectrumView.pas | 9 ++++++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/MainForm.pas b/MainForm.pas index 4bfd5dd..9d86d7a 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -301,6 +301,7 @@ type // Waterfall frame timing FWaterfallFrameInterval: Integer; FWaterfallFrameCounter: Integer; + FAgcLineCounter: Integer; // ---- Splitter ---- FSplitterDrag: Boolean; FSplitterDragY0: Integer; @@ -2874,7 +2875,6 @@ begin ((PbWaterfall.Width <> FSpectrumWidth) or (PbWaterfall.Height <> FWaterfallHeight))) then ResizeSpectrumPanels; - ResizeSMeter; if FSpectrumWidth <= 0 then Exit; SyncSpecViewFreq; @@ -2920,9 +2920,14 @@ begin begin FLastSMeter := FDSPEngine.GetSMeterDBm; FDSPEngine.SetSpectrumWidth(FSpectrumWidth); - FDSPEngine.UpdateAGCLines(FSpectrumWidth); - FSpecView.AGCThresh := FDSPEngine.AGCThresh; - FSpecView.AGCHangLevel := FDSPEngine.AGCHangLevel; + Inc(FAgcLineCounter); + if FAgcLineCounter >= 6 then + begin + FDSPEngine.UpdateAGCLines(FSpectrumWidth); + FSpecView.AGCThresh := FDSPEngine.AGCThresh; + FSpecView.AGCHangLevel := FDSPEngine.AGCHangLevel; + FAgcLineCounter := 0; + end; end; FSpecView.WDSPReady := FWDSPReady; // Обновляем оверлей если видим diff --git a/SpectrumView.pas b/SpectrumView.pas index 5667a20..febc724 100644 --- a/SpectrumView.pas +++ b/SpectrumView.pas @@ -696,7 +696,7 @@ procedure TSpectrumView.DrawSpectrum; var C, GC: TCanvas; i, Yp, W, H, GX: Integer; - AlphaRow: PCardinal; + AlphaPtr: PByte; DBmin, DBmax, dB: Double; VfoX, X1, X2: Integer; TXVfoX, TXX1, TXX2: Integer; @@ -907,9 +907,12 @@ begin FSpectrumBitmap.BeginUpdate(False); for i := 0 to H - 1 do begin - AlphaRow := PCardinal(FSpectrumBitmap.ScanLine[i]); + AlphaPtr := PByte(FSpectrumBitmap.ScanLine[i]) + 3; for Yp := 0 to W - 1 do - AlphaRow[Yp] := AlphaRow[Yp] or $FF000000; + begin + AlphaPtr^ := $FF; + Inc(AlphaPtr, 4); + end; end; FSpectrumBitmap.EndUpdate(False); end;