forked from bit/DotRecastNetSim
Added struct DtCrowdScopedTimer to avoid allocations in scoped timer calls @wrenge
- https://github.com/ikpil/DotRecast/pull/54
This commit is contained in:
parent
3158dfc29c
commit
804cb275a7
|
@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||
|
||||
### Added
|
||||
- Added RcCircularBuffer<T> [@ikpil](https://github.com/ikpil)
|
||||
- Added struct DtCrowdScopedTimer to avoid allocations in scoped timer calls. [@wrenge](https://github.com/wrenge)
|
||||
|
||||
### Fixed
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@ freely, subject to the following restrictions:
|
|||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using DotRecast.Core;
|
||||
using DotRecast.Core.Collections;
|
||||
using DotRecast.Core.Numerics;
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
using System;
|
||||
|
||||
namespace DotRecast.Detour.Crowd
|
||||
{
|
||||
internal readonly struct DtCrowdScopedTimer : IDisposable
|
||||
{
|
||||
private readonly DtCrowdTimerLabel _label;
|
||||
private readonly DtCrowdTelemetry _telemetry;
|
||||
|
||||
internal DtCrowdScopedTimer(DtCrowdTelemetry telemetry, DtCrowdTimerLabel label)
|
||||
{
|
||||
_telemetry = telemetry;
|
||||
_label = label;
|
||||
|
||||
_telemetry.Start(_label);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_telemetry.Stop(_label);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -27,24 +27,6 @@ namespace DotRecast.Detour.Crowd
|
|||
{
|
||||
public class DtCrowdTelemetry
|
||||
{
|
||||
public readonly struct DisposableHandle : IDisposable
|
||||
{
|
||||
private readonly DtCrowdTimerLabel _label;
|
||||
private readonly DtCrowdTelemetry _telemetry;
|
||||
|
||||
public DisposableHandle(DtCrowdTelemetry telemetry, DtCrowdTimerLabel label)
|
||||
{
|
||||
_telemetry = telemetry;
|
||||
_label = label;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_telemetry.Stop(_label);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public const int TIMING_SAMPLES = 10;
|
||||
private float _maxTimeToEnqueueRequest;
|
||||
private float _maxTimeToFindPath;
|
||||
|
@ -87,18 +69,17 @@ namespace DotRecast.Detour.Crowd
|
|||
_maxTimeToFindPath = Math.Max(_maxTimeToFindPath, time);
|
||||
}
|
||||
|
||||
public DisposableHandle ScopedTimer(DtCrowdTimerLabel label)
|
||||
internal DtCrowdScopedTimer ScopedTimer(DtCrowdTimerLabel label)
|
||||
{
|
||||
Start(label);
|
||||
return new DisposableHandle(this, label);
|
||||
return new DtCrowdScopedTimer(this, label);
|
||||
}
|
||||
|
||||
private void Start(DtCrowdTimerLabel name)
|
||||
internal void Start(DtCrowdTimerLabel name)
|
||||
{
|
||||
_executionTimings.Add(name, RcFrequency.Ticks);
|
||||
}
|
||||
|
||||
private void Stop(DtCrowdTimerLabel name)
|
||||
internal void Stop(DtCrowdTimerLabel name)
|
||||
{
|
||||
long duration = RcFrequency.Ticks - _executionTimings[name];
|
||||
if (!_executionTimingSamples.TryGetValue(name, out var cb))
|
||||
|
@ -110,7 +91,5 @@ namespace DotRecast.Detour.Crowd
|
|||
cb.PushBack(duration);
|
||||
_executionTimings[name] = (long)cb.Average();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue