From c07e760e5edd0253bc8ecb2eee53337f81882585 Mon Sep 17 00:00:00 2001 From: Jordan Russell Date: Sun, 17 Nov 2024 03:15:34 -0600 Subject: [PATCH] Optimize UpdateCompileStatusPanels. --- Projects/Src/IDE.MainForm.pas | 39 +++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/Projects/Src/IDE.MainForm.pas b/Projects/Src/IDE.MainForm.pas index 2f3357534..d1755cca6 100644 --- a/Projects/Src/IDE.MainForm.pas +++ b/Projects/Src/IDE.MainForm.pas @@ -473,6 +473,7 @@ TMainForm = class(TUIStateForm) FBuildAnimationFrame: Cardinal; FLastAnimationTick: DWORD; FProgress, FProgressMax: Cardinal; + FTaskbarProgressValue: Cardinal; FProgressThemeData: HTHEME; FMenuThemeData: HTHEME; FToolbarThemeData: HTHEME; @@ -2312,6 +2313,7 @@ procedure TMainForm.CompileFile(AFilename: String; const ReadFromFile: Boolean); FBuildAnimationFrame := 0; FProgress := 0; FProgressMax := 0; + FTaskbarProgressValue := 0; FActiveMemo.CancelAutoCompleteAndCallTip; FActiveMemo.Cursor := crAppStart; @@ -7108,16 +7110,15 @@ procedure TMainForm.InvalidateStatusPanel(const Index: Integer); procedure TMainForm.UpdateCompileStatusPanels(const AProgress, AProgressMax: Cardinal; const ASecondsRemaining: Integer; const ABytesCompressedPerSecond: Cardinal); -var - T: DWORD; begin - { Icon panel } - T := GetTickCount; - if Cardinal(T - FLastAnimationTick) >= Cardinal(500) then begin - FLastAnimationTick := T; + var CurTick := GetTickCount; + var LastTick := FLastAnimationTick; + FLastAnimationTick := CurTick; + + { Icon and text panels - updated every 500ms } + if CurTick div 500 <> LastTick div 500 then begin InvalidateStatusPanel(spCompileIcon); FBuildAnimationFrame := (FBuildAnimationFrame + 1) mod 4; - { Also update the status text twice a second } if ASecondsRemaining >= 0 then StatusBar.Panels[spExtraStatus].Text := Format( ' Estimated time remaining: %.2d%s%.2d%s%.2d Average KB/sec: %.0n', @@ -7128,13 +7129,29 @@ procedure TMainForm.UpdateCompileStatusPanels(const AProgress, StatusBar.Panels[spExtraStatus].Text := ''; end; - { Progress panel and taskbar progress bar } - if (FProgress <> AProgress) or - (FProgressMax <> AProgressMax) then begin + { Progress panel and taskbar progress bar - updated every 100ms } + if (CurTick div 100 <> LastTick div 100) and + ((FProgress <> AProgress) or (FProgressMax <> AProgressMax)) then begin FProgress := AProgress; FProgressMax := AProgressMax; InvalidateStatusPanel(spCompileProgress); - SetAppTaskbarProgressValue(AProgress, AProgressMax); + + { The taskbar progress updates are slow (on Windows 11). Limiting the + range to 64 instead of 1024 improved compression KB/sec by about 4% + (9000 to 9400) when the rate limit above is disabled. } + var NewValue: Cardinal := 1; { must be at least 1 for progress bar to show } + if AProgressMax > 0 then begin + { Not using MulDiv here to avoid rounding up } + NewValue := (AProgress * 64) div AProgressMax; + if NewValue = 0 then + NewValue := 1; + end; + { Don't call the function if the value hasn't changed, just in case there's + a performance penalty. (There doesn't appear to be on Windows 11.) } + if FTaskbarProgressValue <> NewValue then begin + FTaskbarProgressValue := NewValue; + SetAppTaskbarProgressValue(NewValue, 64); + end; end; end;