Another fix for network profiler to properly handle stats updating when recording is disabled

#2815
This commit is contained in:
Wojtek Figat
2024-10-14 12:12:06 +02:00
parent 443fe5dbcb
commit 4ddf1a2cc8
3 changed files with 41 additions and 20 deletions

View File

@@ -44,7 +44,8 @@ namespace FlaxEditor.Windows.Profiler
private readonly Table _tableRep;
private List<Row> _tableRowsCache;
private SamplesBuffer<ProfilingTools.NetworkEventStat[]> _events;
private NetworkDriverStats _prevStats;
private NetworkDriverStats _frameStats;
private NetworkDriverStats _prevTotalStats;
private List<NetworkDriverStats> _stats;
public Network()
@@ -109,34 +110,41 @@ namespace FlaxEditor.Windows.Profiler
_dataReceivedRateChart.Clear();
_events?.Clear();
_stats?.Clear();
_prevStats = new NetworkDriverStats();
_frameStats = _prevTotalStats = new NetworkDriverStats();
}
/// <inheritdoc />
public override void UpdateStats()
{
// Gather peer stats
var peers = NetworkPeer.Peers;
var totalStats = new NetworkDriverStats();
totalStats.RTT = Time.UnscaledGameTime; // Store sample time in RTT
foreach (var peer in peers)
{
var peerStats = peer.NetworkDriver.GetStats();
totalStats.TotalDataSent += peerStats.TotalDataSent;
totalStats.TotalDataReceived += peerStats.TotalDataReceived;
}
var stats = totalStats;
stats.TotalDataSent = (uint)Mathf.Max((long)totalStats.TotalDataSent - (long)_prevTotalStats.TotalDataSent, 0);
stats.TotalDataReceived = (uint)Mathf.Max((long)totalStats.TotalDataReceived - (long)_prevTotalStats.TotalDataReceived, 0);
_frameStats = stats;
_prevTotalStats = totalStats;
}
/// <inheritdoc />
public override void Update(ref SharedUpdateData sharedData)
{
// Gather peer stats
var peers = NetworkPeer.Peers;
var thisStats = new NetworkDriverStats();
thisStats.RTT = Time.UnscaledGameTime; // Store sample time in RTT
foreach (var peer in peers)
{
var peerStats = peer.NetworkDriver.GetStats();
thisStats.TotalDataSent += peerStats.TotalDataSent;
thisStats.TotalDataReceived += peerStats.TotalDataReceived;
}
var stats = thisStats;
stats.TotalDataSent = (uint)Mathf.Max((long)thisStats.TotalDataSent - (long)_prevStats.TotalDataSent, 0);
stats.TotalDataReceived = (uint)Mathf.Max((long)thisStats.TotalDataReceived - (long)_prevStats.TotalDataReceived, 0);
_dataSentChart.AddSample(stats.TotalDataSent);
_dataReceivedChart.AddSample(stats.TotalDataReceived);
_prevStats = thisStats;
// Add this-frame stats
_dataSentChart.AddSample(_frameStats.TotalDataSent);
_dataReceivedChart.AddSample(_frameStats.TotalDataReceived);
if (_stats == null)
_stats = new List<NetworkDriverStats>();
_stats.Add(stats);
_stats.Add(_frameStats);
// Remove all stats older than 1 second
while (_stats.Count > 0 && thisStats.RTT - _stats[0].RTT >= 1.0f)
while (_stats.Count > 0 && _frameStats.RTT - _stats[0].RTT >= 1.0f)
_stats.RemoveAt(0);
// Calculate average data rates (from last second)

View File

@@ -120,6 +120,13 @@ namespace FlaxEditor.Windows.Profiler
{
}
/// <summary>
/// Tick called before updating any modes display. Can be used to update per-frame statistics data.
/// </summary>
public virtual void UpdateStats()
{
}
/// <summary>
/// Updates the mode view. Called after init and on selected frame changed.
/// </summary>

View File

@@ -230,6 +230,12 @@ namespace FlaxEditor.Windows.Profiler
/// <inheritdoc />
public override void OnUpdate()
{
for (int i = 0; i < _tabs.ChildrenCount; i++)
{
if (_tabs.Children[i] is ProfilerMode mode)
mode.UpdateStats();
}
if (LiveRecording)
{
FlaxEngine.Profiler.BeginEvent("ProfilerWindow.OnUpdate");