servicepoint-tanks/tanks-backend/TanksServer/GameLogic/UpdatesPerSecondCounter.cs

63 lines
2 KiB
C#
Raw Normal View History

2024-04-30 10:38:09 +02:00
using System.Diagnostics;
namespace TanksServer.GameLogic;
internal sealed class UpdatesPerSecondCounter(ILogger<UpdatesPerSecondCounter> logger) : ITickStep
{
2024-04-30 11:16:26 +02:00
private static readonly TimeSpan LongTime = TimeSpan.FromSeconds(5);
private static readonly TimeSpan CriticalUpdateTime = TimeSpan.FromMilliseconds(50);
2024-04-30 10:38:09 +02:00
private readonly Stopwatch _long = Stopwatch.StartNew();
private ulong _updatesSinceLongReset;
private TimeSpan _minFrameTime = TimeSpan.MaxValue;
private TimeSpan _maxFrameTime = TimeSpan.MinValue;
public ValueTask TickAsync(TimeSpan delta)
{
if (logger.IsEnabled(LogLevel.Trace))
logger.LogTrace("time since last update: {}", delta);
2024-04-30 11:16:26 +02:00
if (delta > CriticalUpdateTime)
{
logger.LogCritical("a single update took {}, which is longer than the allowed {}",
delta, CriticalUpdateTime);
}
2024-04-30 10:38:09 +02:00
if (_minFrameTime > delta)
_minFrameTime = delta;
if (_maxFrameTime < delta)
_maxFrameTime = delta;
_updatesSinceLongReset++;
2024-04-30 11:16:26 +02:00
if (_long.Elapsed < LongTime)
2024-04-30 10:38:09 +02:00
return ValueTask.CompletedTask;
LogCounters();
ResetCounters();
return ValueTask.CompletedTask;
}
private void LogCounters()
{
if (!logger.IsEnabled(LogLevel.Debug))
return;
var time = _long.Elapsed;
2024-04-30 11:16:26 +02:00
var averageTime = Math.Round(time.TotalMilliseconds / _updatesSinceLongReset, 2);
var averageUps = Math.Round(_updatesSinceLongReset / time.TotalSeconds, 2);
var min = Math.Round(_minFrameTime.TotalMilliseconds, 2);
var max = Math.Round(_maxFrameTime.TotalMilliseconds, 2);
logger.LogDebug("count={}, time={}, avg={}ms, ups={}, min={}ms, max={}ms",
_updatesSinceLongReset, time, averageTime, averageUps, min, max);
2024-04-30 10:38:09 +02:00
}
private void ResetCounters()
{
_long.Restart();
_updatesSinceLongReset = 0;
_minFrameTime = TimeSpan.MaxValue;
_maxFrameTime = TimeSpan.MinValue;
}
}