log frame times
This commit is contained in:
		
							parent
							
								
									41fb0927f1
								
							
						
					
					
						commit
						a2ae6d273e
					
				
					 5 changed files with 63 additions and 10 deletions
				
			
		|  | @ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Vinzenz Schroeter
						Vinzenz Schroeter