Files
GoakeFlax/Source/Game/Hud/PerformanceWidget.cs

90 lines
2.2 KiB
C#

using System;
using System.Diagnostics;
using FlaxEngine;
using FlaxEngine.GUI;
namespace Game
{
[ExecuteInEditMode]
public class PerformanceWidget : Script
{
private const double updateInterval = 0.2;
public UIControl control;
private Label label;
private Stopwatch stopwatch;
private double updateTimeAvg;
private ulong updateTimeCount;
public override void OnAwake()
{
label = (Label)control.Control;
label.Text = $"0fps";
control.HideFlags = HideFlags.None;
stopwatch = Stopwatch.StartNew();
}
public override void OnUpdate()
{
updateTimeCount++;
double elapsed = stopwatch.Elapsed.TotalSeconds;
if (elapsed >= updateInterval)
{
stopwatch.Restart();
updateTimeAvg = elapsed / updateTimeCount;
updateTimeCount = 0;
label.Text = "";
long triangles = 0;
long drawCalls = 0;
#if BUILD_DEBUG || BUILD_DEVELOPMENT
var gpuEvents = ProfilingTools.EventsGPU;
if (gpuEvents.Length > 0)
{
triangles = gpuEvents[0].Stats.Triangles;
drawCalls = gpuEvents[0].Stats.DrawCalls;
}
#endif
label.Text += $"{triangles} tris\n {drawCalls} drawcalls\n";
label.Text += $"{(int)Math.Round(1.0f / updateTimeAvg)}fps";
}
#if false
#if BUILD_DEVELOPMENT
var nameOffset = Marshal.OffsetOf(typeof(ProfilerCPU.Event), "Name0");
foreach (var eventsCpu in FlaxEngine.ProfilingTools.EventsCPU)
{
sb.Append("\nName: " + eventsCpu.Name + " ");
foreach (var eventt in eventsCpu.Events)
{
#if FLAX_EDITOR
string eventName = eventt.Name;
#else
string eventName;
unsafe
{
var ptr1 = &eventt;
char* ptr2 = (char*)(new IntPtr((byte*)ptr1 + nameOffset.ToInt64()));
//fixed (char* name = &eventt)
{
eventName = new string(ptr2);
}
}
#endif
sb.Append(eventName + " " + (eventt.End-eventt.Start) + "ms, ");
}
}
#endif
#endif
}
}
}