Files
GoakeFlax/Source/Game/Hud/FpsScript.cs
2022-05-14 19:10:13 +03:00

181 lines
5.4 KiB
C#

using System;
using System.Diagnostics;
using System.Text;
using FlaxEditor.Content.Settings;
using FlaxEngine;
using FlaxEngine.GUI;
namespace Game
{
[ExecuteInEditMode]
public class FpsScript : Script
{
private const double updateInterval = 0.25;
private const double drawInterval = 0.25;
private const double physicsInterval = 0.25;
private double conTime;
public UIControl control;
private string currentRenderer = "Unknown";
private double drawAccumTime;
private double drawTimeAvg;
private ulong drawTimeCount;
private Label label;
private double physicsAccumTime;
private double physicsTimeAvg;
private ulong physicsTimeCount;
private Stopwatch sw;
private Stopwatch sw0;
private Stopwatch sw2;
private Stopwatch sw3;
private RenderTask t;
private TimeSettings timeSettings;
private double updateAccumTime;
private double updateTimeAvg;
private ulong updateTimeCount;
public override void OnAwake()
{
label = (Label)control.Control;
sw = Stopwatch.StartNew();
sw2 = Stopwatch.StartNew();
sw3 = Stopwatch.StartNew();
sw0 = Stopwatch.StartNew();
currentRenderer = GPUDevice.Instance.RendererType.ToString();
if (t == null)
{
//Destroy(t);
t = new RenderTask();
t.Render += OnDraw;
}
GameSettings settings = GameSettings.Load();
timeSettings = settings.Time.CreateInstance<TimeSettings>();
}
public override void OnDestroy()
{
Destroy(t);
t = null;
}
public override void OnUpdate()
{
updateAccumTime += Time.DeltaTime;
updateTimeCount++;
double elapsed = sw.Elapsed.TotalSeconds;
if (elapsed >= updateInterval)
{
sw.Restart();
updateTimeAvg = elapsed / updateTimeCount;
updateTimeCount = 0;
conTime = ConsoleContentTextBox.accumDrawTime / ConsoleContentTextBox.accumDrawTimes * 1000.0;
ConsoleContentTextBox.accumDrawTime = 0.0;
ConsoleContentTextBox.accumDrawTimes = 0;
}
StringBuilder sb = new StringBuilder();
sb.Append("eFPS: " + Engine.FramesPerSecond);
sb.Append(" uTime: " + sw0.Elapsed.TotalSeconds);
sb.Append("\nuFPS: " + (int)Math.Round(1.0f / updateTimeAvg));
sb.Append(" uTime: " + updateAccumTime);
sb.Append("\nrFPS: " + (int)Math.Round(1.0f / drawTimeAvg));
sb.Append(" rTime: " + drawAccumTime);
sb.Append("\npFPS: " + (int)Math.Round(1.0f / physicsTimeAvg));
sb.Append(" pTime: " + physicsAccumTime);
//sb.Append("\nCon: " + conTime.ToString() + "ms");
//sb.Append("\nGC memory: " + (GC.GetTotalMemory(false) / 1000000.0f).ToString() + "MB");
//sb.Append("\nUpdate profiler: " + updateProfTime.ToString() + "ms");
#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
((Label)control.Control).Text = sb.ToString();
/*if (!Platform.HasFocus)
{
Time.UpdateFPS = 15;
Time.DrawFPS = 15;
Time.PhysicsFPS = 15;
}
#if FLAX_EDITOR
else if (!FlaxEditor.Editor.IsPlayMode)
{
var editorFPS = FlaxEditor.Editor.Instance.Options.Options.General.EditorFPS;
Time.UpdateFPS = editorFPS;
Time.DrawFPS = editorFPS;
Time.PhysicsFPS = timeSettings.PhysicsFPS;
}
#endif
else
{
Time.UpdateFPS = timeSettings.UpdateFPS;
Time.DrawFPS = timeSettings.DrawFPS;
Time.PhysicsFPS = timeSettings.PhysicsFPS;
}*/
}
public override void OnFixedUpdate()
{
physicsAccumTime += Time.DeltaTime;
physicsTimeCount++;
double elapsed = sw3.Elapsed.TotalSeconds;
if (elapsed >= physicsInterval)
{
sw3.Restart();
physicsTimeAvg = elapsed / physicsTimeCount;
physicsTimeCount = 0;
}
}
private void OnDraw(RenderTask tt, GPUContext context)
{
drawAccumTime += Time.DeltaTime;
drawTimeCount++;
double elapsed = sw2.Elapsed.TotalSeconds;
if (elapsed >= drawInterval)
{
sw2.Restart();
drawTimeAvg = elapsed / drawTimeCount;
drawTimeCount = 0;
}
}
}
}