diff --git a/src/Build/Logging/TerminalLogger/TerminalLogger.cs b/src/Build/Logging/TerminalLogger/TerminalLogger.cs index 33696ada520..64f2cd341d6 100644 --- a/src/Build/Logging/TerminalLogger/TerminalLogger.cs +++ b/src/Build/Logging/TerminalLogger/TerminalLogger.cs @@ -1058,11 +1058,22 @@ private void ErrorRaised(object sender, BuildErrorEventArgs e) private void ThreadProc() { // 1_000 / 30 is a poor approx of 30Hz + var count = 0; while (!_cts.Token.WaitHandle.WaitOne(1_000 / 30)) { + count++; lock (_lock) { - DisplayNodes(); + // Querying the terminal for it's dimensions is expensive, so we only do it every 30 frames e.g. once a second. + if (count >= 30) + { + count = 0; + DisplayNodes(); + } + else + { + DisplayNodes(false); + } } } @@ -1073,9 +1084,11 @@ private void ThreadProc() /// Render Nodes section. /// It shows what all build nodes do. /// - internal void DisplayNodes() + internal void DisplayNodes(bool updateSize = true) { - TerminalNodesFrame newFrame = new TerminalNodesFrame(_nodes, width: Terminal.Width, height: Terminal.Height); + var width = updateSize ? Terminal.Width : _currentFrame.Width; + var height = updateSize ? Terminal.Height : _currentFrame.Height; + TerminalNodesFrame newFrame = new TerminalNodesFrame(_nodes, width: width, height: height); // Do not render delta but clear everything if Terminal width or height have changed. if (newFrame.Width != _currentFrame.Width || newFrame.Height != _currentFrame.Height)