mirror of
https://github.com/MCCTeam/Minecraft-Console-Client
synced 2026-08-15 13:04:36 +00:00
fix: prevent TUI StackOverflowException from excessive log controls
The TUI log view used an ItemsControl with 5000 max entries and no UI virtualization. Avalonia's composition renderer traverses the entire visual tree on each frame -- with thousands of TextBlock controls, the recursive Render/RenderCore calls exceed the thread stack size on constrained devices (especially ARM where each stack frame is larger due to ABI differences), causing a StackOverflowException in ServerCompositionContainerVisual.Render. Changes: - Enable VirtualizingStackPanel on the log ItemsControl so Avalonia only creates visuals for the rows currently in the viewport. - Add [Console.General] TUI_Log_Scrollback config option so users can control max log lines in TUI mode. Default is 0 (automatic: 3000 on x86/x64, 500 on ARM/ARM64). Made-with: Cursor
This commit is contained in:
parent
2003786608
commit
512445cb1d
4 changed files with 41 additions and 1 deletions
|
|
@ -2,6 +2,7 @@ using System;
|
|||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Controls.Primitives;
|
||||
|
|
@ -16,9 +17,20 @@ namespace MinecraftClient.Tui
|
|||
{
|
||||
public class MainTuiView : UserControl
|
||||
{
|
||||
private const int MaxLogLines = 5000;
|
||||
private static readonly int MaxLogLines = ResolveMaxLogLines();
|
||||
private const int CtrlCDoublePressMsec = 1500;
|
||||
|
||||
private static int ResolveMaxLogLines()
|
||||
{
|
||||
int configured = Settings.Config.Console.General.TUI_Log_Scrollback;
|
||||
if (configured > 0)
|
||||
return configured;
|
||||
|
||||
bool isArm = RuntimeInformation.ProcessArchitecture
|
||||
is Architecture.Arm or Architecture.Arm64;
|
||||
return isArm ? 500 : 3000;
|
||||
}
|
||||
|
||||
private readonly ObservableCollection<string> _logLines = new();
|
||||
private readonly ObservableCollection<Control> _logControls = new();
|
||||
private readonly ItemsControl _logItemsControl;
|
||||
|
|
@ -78,6 +90,7 @@ namespace MinecraftClient.Tui
|
|||
{
|
||||
ItemsSource = _logControls,
|
||||
Focusable = false,
|
||||
ItemsPanel = new FuncTemplate<Panel?>(() => new VirtualizingStackPanel()),
|
||||
};
|
||||
|
||||
_logScrollViewer = new ScrollViewer
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue