more consistent tick pacing
This commit is contained in:
parent
dc9ad21a3d
commit
190c0c3143
2 changed files with 11 additions and 5 deletions
56
TanksServer/GameTickWorker.cs
Normal file
56
TanksServer/GameTickWorker.cs
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
using System.Diagnostics;
|
||||||
|
using Microsoft.Extensions.Hosting;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using TanksServer.TickSteps;
|
||||||
|
|
||||||
|
namespace TanksServer;
|
||||||
|
|
||||||
|
internal sealed class GameTickWorker(
|
||||||
|
IEnumerable<ITickStep> steps, IHostApplicationLifetime lifetime, ILogger<GameTickWorker> logger
|
||||||
|
) : IHostedService, IDisposable
|
||||||
|
{
|
||||||
|
private readonly CancellationTokenSource _cancellation = new();
|
||||||
|
private readonly List<ITickStep> _steps = steps.ToList();
|
||||||
|
private Task? _run;
|
||||||
|
|
||||||
|
public Task StartAsync(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
_run = RunAsync();
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task RunAsync()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var sw = new Stopwatch();
|
||||||
|
while (!_cancellation.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
logger.LogTrace("since last frame: {}", sw.Elapsed);
|
||||||
|
sw.Restart();
|
||||||
|
|
||||||
|
foreach (var step in _steps)
|
||||||
|
await step.TickAsync();
|
||||||
|
|
||||||
|
await Task.Delay(TimeSpan.FromMilliseconds(1000 / 25) - sw.Elapsed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
logger.LogError(ex, "game tick service crashed");
|
||||||
|
lifetime.StopApplication();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task StopAsync(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
await _cancellation.CancelAsync();
|
||||||
|
if (_run != null) await _run;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
_cancellation.Dispose();
|
||||||
|
_run?.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -88,7 +88,7 @@ internal static class Program
|
||||||
builder.Services.AddSingleton<LastFinishedFrameProvider>();
|
builder.Services.AddSingleton<LastFinishedFrameProvider>();
|
||||||
builder.Services.AddSingleton<SpawnQueueProvider>();
|
builder.Services.AddSingleton<SpawnQueueProvider>();
|
||||||
|
|
||||||
builder.Services.AddHostedService<GameTickService>();
|
builder.Services.AddHostedService<GameTickWorker>();
|
||||||
builder.Services.AddHostedService(sp => sp.GetRequiredService<ControlsServer>());
|
builder.Services.AddHostedService(sp => sp.GetRequiredService<ControlsServer>());
|
||||||
builder.Services.AddHostedService(sp => sp.GetRequiredService<ClientScreenServer>());
|
builder.Services.AddHostedService(sp => sp.GetRequiredService<ClientScreenServer>());
|
||||||
|
|
||||||
|
|
|
||||||
Reference in a new issue