Files
sbox-public/game/addons/tools/Code/Diagnostics/PerformanceDock.cs
s&box team 71f266059a Open source release
This commit imports the C# engine code and game files, excluding C++ source code.

[Source-Commit: ceb3d758046e50faa6258bc3b658a30c97743268]
2025-11-24 09:05:18 +00:00

90 lines
2.2 KiB
C#

using Sandbox.Diagnostics;
namespace Editor;
[Dock( "Editor", "Performance", "timer" )]
public class PerformanceDock : Widget
{
RealtimeChart Chart;
Button MenuButton;
public float RefreshSpeed = 0.25f;
public PerformanceDock( Widget parent ) : base( parent )
{
MinimumSize = 200;
MenuButton = new Button.Clear( "", this );
MenuButton.Icon = "settings";
MenuButton.Clicked = OpenMenu;
Chart = new RealtimeChart( this );
Chart.BackgroundColor = Theme.SurfaceBackground.Darken( 0.7f );
Chart.Visible = true;
Chart.Lower();
}
private void OpenMenu()
{
var menu = new ContextMenu( this );
menu.AddOption( new Option { Text = "Every Frame", Checkable = true, Checked = RefreshSpeed == 0, Triggered = () => RefreshSpeed = 0 } );
menu.AddOption( new Option { Text = "Fast", Checkable = true, Checked = RefreshSpeed == 0.1f, Triggered = () => RefreshSpeed = 0.1f } );
menu.AddOption( new Option { Text = "Medium", Checkable = true, Checked = RefreshSpeed == 0.25f, Triggered = () => RefreshSpeed = 0.25f } );
menu.AddOption( new Option { Text = "Slow", Checkable = true, Checked = RefreshSpeed == 0.5f, Triggered = () => RefreshSpeed = 0.5f } );
menu.Position = MenuButton.ScreenRect.BottomLeft;
menu.Visible = true;
}
protected override void DoLayout()
{
base.DoLayout();
if ( Chart.IsValid() )
{
Chart.Position = 0;
Chart.Size = Size;
}
MenuButton.Size = 32;
MenuButton.Position = 8;
}
RealTimeSince timeSinceUpdate;
int framesSinceUpdate;
[EditorEvent.Frame]
public void Frame()
{
framesSinceUpdate++;
if ( timeSinceUpdate < RefreshSpeed )
return;
if ( !Chart.IsValid() )
return;
// TODO - add a toolbar with settings for all this shit
// especially ScrollSize and the update speed above
timeSinceUpdate = 0;
Chart.ScrollSize = (int)(RefreshSpeed * 20) + 1;
Chart.MinMax = new Vector2( 16, 0 );
Chart.Stacked = true;
Chart.ChartType = "bar";
Chart.GridLineMajor = 4;
Chart.GridLineMinor = 0;
foreach ( var entry in PerformanceStats.Timings.GetMain() )
{
var renderColor = entry.Color;
Chart.SetData( entry.Name, "image", renderColor, entry.GetMetric( framesSinceUpdate ) );
}
Chart.Draw();
framesSinceUpdate = 0;
}
}