using System; using System.Diagnostics; using System.Text; 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 Stopwatch stopwatch2; private double updateTimeAvg; private double updateTimeAvg2; private ulong updateTimeCount; private ulong updateTimeCount2; public override void OnAwake() { label = (Label)control.Control; label.Text = $"0fps"; control.HideFlags = HideFlags.None; stopwatch = Stopwatch.StartNew(); stopwatch2 = Stopwatch.StartNew(); } public override void OnUpdate() { updateTimeCount2++; double elapsed2 = stopwatch2.Elapsed.TotalSeconds; if (elapsed2 >= updateInterval * 10) { stopwatch2.Restart(); updateTimeAvg2 = elapsed2 / updateTimeCount2; updateTimeCount2 = 0; } updateTimeCount++; double elapsed = stopwatch.Elapsed.TotalSeconds; if (elapsed >= updateInterval) { stopwatch.Restart(); updateTimeAvg = elapsed / updateTimeCount; updateTimeCount = 0; StringBuilder text = new StringBuilder(10); #if true 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 text.AppendLine($"{triangles} tris\n {drawCalls} drawcalls"); text.AppendLine($"{(int)Math.Round(1.0f / updateTimeAvg2)}fps2"); #endif text.Append($"{(int)Math.Round(1.0f / updateTimeAvg)}fps"); label.Text = text.ToString(); } #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 } }