mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
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 <noreply@anthropic.com>
This commit is contained in:
+9
-4
@@ -301,6 +301,7 @@ type
|
|||||||
// Waterfall frame timing
|
// Waterfall frame timing
|
||||||
FWaterfallFrameInterval: Integer;
|
FWaterfallFrameInterval: Integer;
|
||||||
FWaterfallFrameCounter: Integer;
|
FWaterfallFrameCounter: Integer;
|
||||||
|
FAgcLineCounter: Integer;
|
||||||
// ---- Splitter ----
|
// ---- Splitter ----
|
||||||
FSplitterDrag: Boolean;
|
FSplitterDrag: Boolean;
|
||||||
FSplitterDragY0: Integer;
|
FSplitterDragY0: Integer;
|
||||||
@@ -2874,7 +2875,6 @@ begin
|
|||||||
((PbWaterfall.Width <> FSpectrumWidth) or
|
((PbWaterfall.Width <> FSpectrumWidth) or
|
||||||
(PbWaterfall.Height <> FWaterfallHeight))) then
|
(PbWaterfall.Height <> FWaterfallHeight))) then
|
||||||
ResizeSpectrumPanels;
|
ResizeSpectrumPanels;
|
||||||
ResizeSMeter;
|
|
||||||
if FSpectrumWidth <= 0 then Exit;
|
if FSpectrumWidth <= 0 then Exit;
|
||||||
SyncSpecViewFreq;
|
SyncSpecViewFreq;
|
||||||
|
|
||||||
@@ -2920,9 +2920,14 @@ begin
|
|||||||
begin
|
begin
|
||||||
FLastSMeter := FDSPEngine.GetSMeterDBm;
|
FLastSMeter := FDSPEngine.GetSMeterDBm;
|
||||||
FDSPEngine.SetSpectrumWidth(FSpectrumWidth);
|
FDSPEngine.SetSpectrumWidth(FSpectrumWidth);
|
||||||
FDSPEngine.UpdateAGCLines(FSpectrumWidth);
|
Inc(FAgcLineCounter);
|
||||||
FSpecView.AGCThresh := FDSPEngine.AGCThresh;
|
if FAgcLineCounter >= 6 then
|
||||||
FSpecView.AGCHangLevel := FDSPEngine.AGCHangLevel;
|
begin
|
||||||
|
FDSPEngine.UpdateAGCLines(FSpectrumWidth);
|
||||||
|
FSpecView.AGCThresh := FDSPEngine.AGCThresh;
|
||||||
|
FSpecView.AGCHangLevel := FDSPEngine.AGCHangLevel;
|
||||||
|
FAgcLineCounter := 0;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
FSpecView.WDSPReady := FWDSPReady;
|
FSpecView.WDSPReady := FWDSPReady;
|
||||||
// Обновляем оверлей если видим
|
// Обновляем оверлей если видим
|
||||||
|
|||||||
+6
-3
@@ -696,7 +696,7 @@ procedure TSpectrumView.DrawSpectrum;
|
|||||||
var
|
var
|
||||||
C, GC: TCanvas;
|
C, GC: TCanvas;
|
||||||
i, Yp, W, H, GX: Integer;
|
i, Yp, W, H, GX: Integer;
|
||||||
AlphaRow: PCardinal;
|
AlphaPtr: PByte;
|
||||||
DBmin, DBmax, dB: Double;
|
DBmin, DBmax, dB: Double;
|
||||||
VfoX, X1, X2: Integer;
|
VfoX, X1, X2: Integer;
|
||||||
TXVfoX, TXX1, TXX2: Integer;
|
TXVfoX, TXX1, TXX2: Integer;
|
||||||
@@ -907,9 +907,12 @@ begin
|
|||||||
FSpectrumBitmap.BeginUpdate(False);
|
FSpectrumBitmap.BeginUpdate(False);
|
||||||
for i := 0 to H - 1 do
|
for i := 0 to H - 1 do
|
||||||
begin
|
begin
|
||||||
AlphaRow := PCardinal(FSpectrumBitmap.ScanLine[i]);
|
AlphaPtr := PByte(FSpectrumBitmap.ScanLine[i]) + 3;
|
||||||
for Yp := 0 to W - 1 do
|
for Yp := 0 to W - 1 do
|
||||||
AlphaRow[Yp] := AlphaRow[Yp] or $FF000000;
|
begin
|
||||||
|
AlphaPtr^ := $FF;
|
||||||
|
Inc(AlphaPtr, 4);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
FSpectrumBitmap.EndUpdate(False);
|
FSpectrumBitmap.EndUpdate(False);
|
||||||
end;
|
end;
|
||||||
|
|||||||
Reference in New Issue
Block a user