Files
ewsdr/ewsdr.lpi
T
ew8bakandClaude Fable 5 0adaff2d21 perf(spectrum): full-raw CPU renderer + dword blenders (frame 8.3ms -> 1.7ms)
Canvas на битмапе кадра больше не используется вообще (кроме редкого
ADC-overload пути с восстановлением альфы) — убраны все raw<->canvas
переходы, каждый из которых синкал весь битмап на Qt6 (~2мс):

- RawBegin/RawEnd: прямой доступ к пикселям через RawImage.Data +
  BytesPerLine (bottom-up DIB win32 учтён отрицательным шагом)
- RawVLine/RawHLine (с пунктиром), RawFillRect, RawTriangleDown,
  RawCurve (кривая = связные вертикальные сегменты по колонкам)
- кэш текстовых масок (TRawTextMask, LRU 48): строка рендерится canvas'ом
  один раз белым-на-чёрном в свой мини-битмап, блитится raw с цветом;
  все тексты кадра теперь Courier New
- конвертированы: маркер (метка без случайной цветной плашки), бикон-
  маркеры, буквы слайсов, слайс-линии, AGC (пунктир 4/2 и 1/2, подпись
  с фоном SpecFilter как раньше), края/VFO/TX-курсоры с треугольниками
- пофреймовый альфа-OR проход удалён: альфа чинится один раз в кэше
  СЕТКИ после ребилда (canvas-текст там), кадр наследует её через memcpy

Дворд-блендеры (два 16-бит лейна на умножение, /256 вместо /255,
расхождение <0.4%) вместо побайтовых с div 255:
- BandPlanOverlay.CompositeStrip (~1мс -> ~0.2мс)
- SampleRateOverlay.CompositeCache (per-px альфа)
- VfoOverlay.BlendBitmapKey (keyed-магента дворд-сравнением)
- SpectrumView.DrawSpectrumGradient (source-лейны 1 раз на строку,
  ~1.6мс -> ~0.8мс)

Порог перестройки бэндплана: полпикселя вместо 1 Гц (на QO-100 с
decoder-lock центр подтюнивается непрерывно — был canvas-ребилд полоски
каждый кадр). Композиты внутри raw-лока (их BeginUpdate вложенные).
PerfLog: зона ui.composites отделена от ui.spec_alpha (=RawEnd).

Замер на эфире (Pluto, 576k, 52fps): кадр 8.3мс -> 1.67мс (5x),
со слайсом 2.1-2.3мс; UI-поток ~45% -> ~26% ядра, из них 15% — блиты
paint_spectrum/paint_waterfall (потолок Qt6-вывода). Визуально проверено.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 00:11:31 +03:00

380 lines
12 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<General>
<SessionStorage Value="InProjectDir"/>
<Title Value="EWSDR"/>
<Scaled Value="True"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<XPManifest>
<DpiAware Value="True/PM_V2"/>
</XPManifest>
<Icon Value="0"/>
</General>
<VersionInfo>
<UseVersionInfo Value="True"/>
<AutoIncrementBuild Value="True"/>
<MinorVersionNr Value="9"/>
<BuildNr Value="244"/>
</VersionInfo>
<MacroValues Count="62">
<Macro1 Name="LCLWidgetType" Value="qt6"/>
<Macro2 Name="LCLWidgetType" Value="qt6"/>
<Macro3 Name="LCLWidgetType" Value="qt6"/>
<Macro4 Name="LCLWidgetType" Value="qt6"/>
<Macro5 Name="LCLWidgetType" Value="qt6"/>
<Macro6 Name="LCLWidgetType" Value="qt6"/>
<Macro7 Name="LCLWidgetType" Value="qt6"/>
<Macro8 Name="LCLWidgetType" Value="qt6"/>
<Macro9 Name="LCLWidgetType" Value="qt6"/>
<Macro10 Name="LCLWidgetType" Value="qt6"/>
<Macro11 Name="LCLWidgetType" Value="qt6"/>
<Macro12 Name="LCLWidgetType" Value="qt6"/>
<Macro13 Name="LCLWidgetType" Value="qt6"/>
<Macro14 Name="LCLWidgetType" Value="qt6"/>
<Macro15 Name="LCLWidgetType" Value="qt6"/>
<Macro16 Name="LCLWidgetType" Value="qt6"/>
<Macro17 Name="LCLWidgetType" Value="qt6"/>
<Macro18 Name="LCLWidgetType" Value="qt6"/>
<Macro19 Name="LCLWidgetType" Value="qt6"/>
<Macro20 Name="LCLWidgetType" Value="qt6"/>
<Macro21 Name="LCLWidgetType" Value="qt6"/>
<Macro22 Name="LCLWidgetType" Value="qt6"/>
<Macro23 Name="LCLWidgetType" Value="qt6"/>
<Macro24 Name="LCLWidgetType" Value="qt6"/>
<Macro25 Name="LCLWidgetType" Value="qt6"/>
<Macro26 Name="LCLWidgetType" Value="qt6"/>
<Macro27 Name="LCLWidgetType" Value="qt6"/>
<Macro28 Name="LCLWidgetType" Value="qt6"/>
<Macro29 Name="LCLWidgetType" Value="qt6"/>
<Macro30 Name="LCLWidgetType" Value="qt6"/>
<Macro31 Name="LCLWidgetType" Value="qt6"/>
<Macro32 Name="LCLWidgetType" Value="qt6"/>
<Macro33 Name="LCLWidgetType" Value="qt6"/>
<Macro34 Name="LCLWidgetType" Value="qt6"/>
<Macro35 Name="LCLWidgetType" Value="qt6"/>
<Macro36 Name="LCLWidgetType" Value="qt6"/>
<Macro37 Name="LCLWidgetType" Value="qt6"/>
<Macro38 Name="LCLWidgetType" Value="qt6"/>
<Macro39 Name="LCLWidgetType" Value="qt6"/>
<Macro40 Name="LCLWidgetType" Value="qt6"/>
<Macro41 Name="LCLWidgetType" Value="qt6"/>
<Macro42 Name="LCLWidgetType" Value="qt6"/>
<Macro43 Name="LCLWidgetType" Value="qt6"/>
<Macro44 Name="LCLWidgetType" Value="qt6"/>
<Macro45 Name="LCLWidgetType" Value="qt6"/>
<Macro46 Name="LCLWidgetType" Value="qt6"/>
<Macro47 Name="LCLWidgetType" Value="qt6"/>
<Macro48 Name="LCLWidgetType" Value="qt6"/>
<Macro49 Name="LCLWidgetType" Value="qt6"/>
<Macro50 Name="LCLWidgetType" Value="qt6"/>
<Macro51 Name="LCLWidgetType" Value="qt6"/>
<Macro52 Name="LCLWidgetType" Value="qt6"/>
<Macro53 Name="LCLWidgetType" Value="qt6"/>
<Macro54 Name="LCLWidgetType" Value="qt6"/>
<Macro55 Name="LCLWidgetType" Value="qt6"/>
<Macro56 Name="LCLWidgetType" Value="qt6"/>
<Macro57 Name="LCLWidgetType" Value="qt6"/>
<Macro58 Name="LCLWidgetType" Value="qt6"/>
<Macro59 Name="LCLWidgetType" Value="qt6"/>
<Macro60 Name="LCLWidgetType" Value="qt6"/>
<Macro61 Name="LCLWidgetType" Value="qt6"/>
<Macro62 Name="LCLWidgetType" Value="qt6"/>
</MacroValues>
<BuildModes>
<Item Name="Debug" Default="True"/>
<Item Name="Release">
<CompilerOptions>
<Version Value="11"/>
<Target>
<Filename Value="bin/$(TargetCPU)-$(TargetOS)/ewsdr"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Parsing>
<SyntaxOptions>
<UseAnsiStrings Value="False"/>
</SyntaxOptions>
</Parsing>
<CodeGeneration>
<SmartLinkUnit Value="True"/>
<Optimizations>
<OptimizationLevel Value="3"/>
</Optimizations>
</CodeGeneration>
<Linking>
<Debugging>
<GenerateDebugInfo Value="False"/>
<RunWithoutDebug Value="True"/>
<StripSymbols Value="True"/>
</Debugging>
<LinkSmart Value="True"/>
</Linking>
<Other>
<CustomOptions Value="-k-L/usr/local/lib"/>
</Other>
</CompilerOptions>
</Item>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<RequiredPackages>
<Item>
<PackageName Value="LazOpenGLContext"/>
</Item>
<Item>
<PackageName Value="LCL"/>
</Item>
</RequiredPackages>
<Units>
<Unit>
<Filename Value="ewsdr.lpr"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="MainForm.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="MainForm"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit>
<Unit>
<Filename Value="HPSDRProtocol.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="HPSDRNetwork.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="WebServer.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="WebPageHtml.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="WDSPEngine.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="BeaconDecoder.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="BeaconFEC.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="BeaconScopeForm.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="VfoOverlay.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="SampleRateOverlay.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="AudioOutput.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="AudioInput.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="DeviceForm.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="SettingsForm.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="FlatButton.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="FlatDropDown.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="AppTheme.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="FlatSlider.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="FlatCheckBox.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="FlatComboBox.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="FlatEdit.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="FMRepeater.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="ChannelStore.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="ChannelsForm.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="FlatSpinEdit.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="FlatFloatSpinEdit.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="FlatListBox.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="FlatRadioButton.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="FlatProgressBar.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="EqualizerControl.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="FreqDisplay.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="WDSP.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="WebUtils.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="WinFirewall.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="WsClient.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="Settings.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="CATEngine.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="CATSerial.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="CATTcp.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="SpectrumView.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="PlatformUtils.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="PowerInhibit.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="BoardUtils.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="WisdomBuilder.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="UISync.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="SpectrumViewOpengl.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="AlertOverlay.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="WaterfallView.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="WaterfallViewOpengl.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="SMeterView.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="RulerView.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<Target>
<Filename Value="bin/$(TargetCPU)-$(TargetOS)/ewsdr-debug"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Parsing>
<SyntaxOptions>
<UseAnsiStrings Value="False"/>
</SyntaxOptions>
</Parsing>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf3"/>
</Debugging>
</Linking>
<Other>
<CustomOptions Value="-k-L/usr/local/lib"/>
</Other>
</CompilerOptions>
</CONFIG>