mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 18:43:51 +00:00
perf: zone CPU profiler (PerfLog) + phase-restructured CPU spectrum render
Инструментация (ВРЕМЕННАЯ, не мержить в main): - PerfLog.pas: зонные таймеры, отчёт раз в 5с в stderr (core% = доля ядра), EWSDR_PERF=0 выкл, EWSDR_PERF_FILE=путь — дублировать в файл - Замеры // PERF: сеть (DDC IQ/wideband), Pluto (rx_conv/tx_resamp/tx_fill), DSP (push_iq/fexchange/slices/tx), аудио, UI (тики/draw/paint/gl_swap, разбивка draw_spectrum по фазам) - doc/PERF_PROFILING.md: карта зон, методика, выводы Оптимизация CPU-рендера спектра (по результатам замеров на эфире): диагноз — дорога не пиксельная работа, а чередование raw(ScanLine)/ canvas(QPainter) доступа к битмапу на Qt6 (~6 переходов за кадр, каждый синкает весь битмап; полоса фильтра в тысячи пикселей стоила 4x дороже полного memcpy кадра). DrawSpectrum перестроен в фазы calc->raw->canvas->raw (2 перехода): FillBandRaw вместо Canvas.FillRect, DrawSliceFilterMarkers разделён на raw-полосы + canvas-линии, композиты флагов и альфа-OR в финальной raw-фазе. Кадр 8.3мс -> 6.1мс; spec_bands 1.87мс -> 0.03мс. Альфа-OR проход на Qt6 подтверждён нужным (без него canvas-пиксели теряют альфу и пропадают при блите), сам цикл ~0.08мс — оставлен; тумблер EWSDR_ALPHA_FIX=0 только для экспериментов. Кисть перед AGC-подписями теперь ставится явно (была остаточной после перестройки фаз). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
+8
-1
@@ -19,7 +19,8 @@ uses
|
||||
{$ELSE}
|
||||
Sockets, BaseUnix,
|
||||
{$ENDIF}
|
||||
HPSDRProtocol, SyncObjs, Settings, RadioBackend;
|
||||
HPSDRProtocol, SyncObjs, Settings, RadioBackend,
|
||||
PerfLog; // ВРЕМЕННО (perf/cpu-profiling): зонные CPU-таймеры
|
||||
|
||||
const
|
||||
DUC_TX_QUEUE_SIZE = 256; // power of two, bounded latency on TX underrun/overrun
|
||||
@@ -1093,11 +1094,14 @@ procedure THPSDRNetwork.HandleDDCIQ(const Buf: array of Byte; Len: Integer;
|
||||
DDCIdx: Integer);
|
||||
var
|
||||
Pkt: TDDCIQPacket;
|
||||
T0: Int64; // PERF
|
||||
begin
|
||||
if not Assigned(FOnDDCIQ) then Exit;
|
||||
T0 := PerfNow; // PERF
|
||||
FillChar(Pkt, SizeOf(Pkt), 0);
|
||||
Move(Buf[0], Pkt, Min(Len, SizeOf(Pkt)));
|
||||
FOnDDCIQ(DDCIdx, Pkt); // прямой вызов из потока — UI не трогает
|
||||
PerfAdd(pzNetDDCIQ, T0); // PERF: копия пакета + постановка в DSP-очередь
|
||||
end;
|
||||
|
||||
procedure THPSDRNetwork.HandleMicData(const Buf: array of Byte; Len: Integer);
|
||||
@@ -1114,9 +1118,11 @@ procedure THPSDRNetwork.HandleWidebandData(const Buf: array of Byte; Len: Intege
|
||||
var
|
||||
Seq: LongWord;
|
||||
I, SamplesInPacket, TargetCount, S: Integer;
|
||||
T0: Int64; // PERF
|
||||
begin
|
||||
if (not FWidebandEnabled) or (ADCIdx <> FWidebandADC) or
|
||||
(FWBSampleBits <> 16) or (Len < 6) then Exit;
|
||||
T0 := PerfNow; // PERF
|
||||
|
||||
SamplesInPacket := (Len - 4) div 2;
|
||||
if SamplesInPacket <= 0 then Exit;
|
||||
@@ -1157,6 +1163,7 @@ begin
|
||||
FWBFrameCount := 0;
|
||||
FWBSeqValid := False;
|
||||
end;
|
||||
PerfAdd(pzNetWideband, T0); // PERF: сборка wideband-кадра + колбэк
|
||||
end;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user