log frame times
This commit is contained in:
parent
41fb0927f1
commit
a2ae6d273e
|
@ -33,20 +33,19 @@ internal sealed class GameTickWorker(
|
||||||
|
|
||||||
private async Task RunAsync()
|
private async Task RunAsync()
|
||||||
{
|
{
|
||||||
|
// do not block in StartAsync
|
||||||
|
await Task.Delay(1).ConfigureAwait(false);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var sw = new Stopwatch();
|
var sw = new Stopwatch();
|
||||||
while (!_cancellation.IsCancellationRequested)
|
while (!_cancellation.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
logger.LogTrace("since last frame: {}", sw.Elapsed);
|
|
||||||
|
|
||||||
var delta = sw.Elapsed;
|
var delta = sw.Elapsed;
|
||||||
sw.Restart();
|
sw.Restart();
|
||||||
|
|
||||||
foreach (var step in _steps)
|
foreach (var step in _steps)
|
||||||
await step.TickAsync(delta);
|
await step.TickAsync(delta);
|
||||||
|
|
||||||
await Task.Delay(1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
|
namespace TanksServer.GameLogic;
|
||||||
|
|
||||||
|
internal sealed class UpdatesPerSecondCounter(ILogger<UpdatesPerSecondCounter> logger) : ITickStep
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
if (delta.TotalSeconds > 1)
|
||||||
|
logger.LogCritical("single update took {}", delta);
|
||||||
|
|
||||||
|
if (_minFrameTime > delta)
|
||||||
|
_minFrameTime = delta;
|
||||||
|
if (_maxFrameTime < delta)
|
||||||
|
_maxFrameTime = delta;
|
||||||
|
|
||||||
|
_updatesSinceLongReset++;
|
||||||
|
|
||||||
|
if (_long.Elapsed.TotalSeconds < 10)
|
||||||
|
return ValueTask.CompletedTask;
|
||||||
|
|
||||||
|
LogCounters();
|
||||||
|
ResetCounters();
|
||||||
|
return ValueTask.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LogCounters()
|
||||||
|
{
|
||||||
|
if (!logger.IsEnabled(LogLevel.Debug))
|
||||||
|
return;
|
||||||
|
|
||||||
|
var time = _long.Elapsed;
|
||||||
|
var average = Math.Round(_updatesSinceLongReset / time.TotalSeconds);
|
||||||
|
var min = Math.Round(1 / _maxFrameTime.TotalSeconds);
|
||||||
|
var max = Math.Round(1 / _minFrameTime.TotalSeconds);
|
||||||
|
logger.LogDebug("UPS stats for {} updates in {}: avg={}, min={}, max={}",
|
||||||
|
_updatesSinceLongReset, time, average, min, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ResetCounters()
|
||||||
|
{
|
||||||
|
_long.Restart();
|
||||||
|
_updatesSinceLongReset = 0;
|
||||||
|
_minFrameTime = TimeSpan.MaxValue;
|
||||||
|
_maxFrameTime = TimeSpan.MinValue;
|
||||||
|
}
|
||||||
|
}
|
|
@ -78,6 +78,7 @@ public static class Program
|
||||||
builder.Services.AddSingleton<ITickStep, SpawnPowerUp>();
|
builder.Services.AddSingleton<ITickStep, SpawnPowerUp>();
|
||||||
builder.Services.AddSingleton<ITickStep, GeneratePixelsTickStep>();
|
builder.Services.AddSingleton<ITickStep, GeneratePixelsTickStep>();
|
||||||
builder.Services.AddSingleton<ITickStep, PlayerServer>(sp => sp.GetRequiredService<PlayerServer>());
|
builder.Services.AddSingleton<ITickStep, PlayerServer>(sp => sp.GetRequiredService<PlayerServer>());
|
||||||
|
builder.Services.AddSingleton<ITickStep, UpdatesPerSecondCounter>();
|
||||||
|
|
||||||
builder.Services.AddSingleton<IDrawStep, DrawMapStep>();
|
builder.Services.AddSingleton<IDrawStep, DrawMapStep>();
|
||||||
builder.Services.AddSingleton<IDrawStep, DrawPowerUpsStep>();
|
builder.Services.AddSingleton<IDrawStep, DrawPowerUpsStep>();
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
"LogLevel": {
|
"LogLevel": {
|
||||||
"Default": "Information",
|
"Default": "Information",
|
||||||
"Microsoft.AspNetCore": "Warning",
|
"Microsoft.AspNetCore": "Warning",
|
||||||
"TanksServer": "Debug",
|
"TanksServer": "Information",
|
||||||
"Microsoft.AspNetCore.HttpLogging": "Information"
|
"TanksServer.GameLogic.UpdatesPerSecondCounter": "Debug"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"AllowedHosts": "*",
|
"AllowedHosts": "*",
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
"SmartBulletHomingSpeed": 1.5
|
"SmartBulletHomingSpeed": 1.5
|
||||||
},
|
},
|
||||||
"Host": {
|
"Host": {
|
||||||
"EnableServicePointDisplay": true,
|
"EnableServicePointDisplay": false,
|
||||||
"ServicePointDisplayMinFrameTimeMs": 28,
|
"ServicePointDisplayMinFrameTimeMs": 28,
|
||||||
"ClientScreenMinFrameTime": 5
|
"ClientScreenMinFrameTime": 5
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
{
|
{
|
||||||
"sdk": {
|
"sdk": {
|
||||||
"version": "8.0.0",
|
"version": "8.0.0",
|
||||||
"rollForward": "latestMajor",
|
"rollForward": "latestMajor"
|
||||||
"allowPrerelease": true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue