Add data sent/receive rate charts to the network profiler in Editor

This commit is contained in:
Wojtek Figat
2023-10-15 20:13:34 +02:00
parent 148ced5a55
commit 88f718709b
2 changed files with 63 additions and 10 deletions

View File

@@ -5,6 +5,7 @@ using System.Collections.Generic;
using FlaxEditor.GUI;
using FlaxEngine;
using FlaxEngine.GUI;
using FlaxEngine.Networking;
namespace FlaxEngine
{
@@ -37,11 +38,14 @@ namespace FlaxEditor.Windows.Profiler
{
private readonly SingleChart _dataSentChart;
private readonly SingleChart _dataReceivedChart;
private readonly SingleChart _dataSentRateChart;
private readonly SingleChart _dataReceivedRateChart;
private readonly Table _tableRpc;
private readonly Table _tableRep;
private SamplesBuffer<ProfilingTools.NetworkEventStat[]> _events;
private List<Row> _tableRowsCache;
private FlaxEngine.Networking.NetworkDriverStats _prevStats;
private SamplesBuffer<ProfilingTools.NetworkEventStat[]> _events;
private NetworkDriverStats _prevStats;
private List<NetworkDriverStats> _stats;
public Network()
: base("Network")
@@ -76,6 +80,20 @@ namespace FlaxEditor.Windows.Profiler
Parent = layout,
};
_dataReceivedChart.SelectedSampleChanged += OnSelectedSampleChanged;
_dataSentRateChart = new SingleChart
{
Title = "Data Sent Rate",
FormatSample = FormatSampleBytesRate,
Parent = layout,
};
_dataSentRateChart.SelectedSampleChanged += OnSelectedSampleChanged;
_dataReceivedRateChart = new SingleChart
{
Title = "Data Received Rate",
FormatSample = FormatSampleBytesRate,
Parent = layout,
};
_dataReceivedRateChart.SelectedSampleChanged += OnSelectedSampleChanged;
// Tables
_tableRpc = InitTable(layout, "RPC Name");
@@ -87,24 +105,52 @@ namespace FlaxEditor.Windows.Profiler
{
_dataSentChart.Clear();
_dataReceivedChart.Clear();
_dataSentRateChart.Clear();
_dataReceivedRateChart.Clear();
_events?.Clear();
_stats?.Clear();
_prevStats = new NetworkDriverStats();
}
/// <inheritdoc />
public override void Update(ref SharedUpdateData sharedData)
{
// Gather peer stats
var peers = FlaxEngine.Networking.NetworkPeer.Peers;
var stats = new FlaxEngine.Networking.NetworkDriverStats();
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();
stats.TotalDataSent += peerStats.TotalDataSent;
stats.TotalDataReceived += peerStats.TotalDataReceived;
thisStats.TotalDataSent += peerStats.TotalDataSent;
thisStats.TotalDataReceived += peerStats.TotalDataReceived;
}
_dataSentChart.AddSample(Mathf.Max((long)stats.TotalDataSent - (long)_prevStats.TotalDataSent, 0));
_dataReceivedChart.AddSample(Mathf.Max((long)stats.TotalDataReceived - (long)_prevStats.TotalDataReceived, 0));
_prevStats = stats;
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;
if (_stats == null)
_stats = new List<NetworkDriverStats>();
_stats.Add(stats);
// Remove all stats older than 1 second
while (_stats.Count > 0 && thisStats.RTT - _stats[0].RTT >= 1.0f)
_stats.RemoveAt(0);
// Calculate average data rates (from last second)
var avgStats = new NetworkDriverStats();
foreach (var e in _stats)
{
avgStats.TotalDataSent += e.TotalDataSent;
avgStats.TotalDataReceived += e.TotalDataReceived;
}
avgStats.TotalDataSent /= (uint)_stats.Count;
avgStats.TotalDataReceived /= (uint)_stats.Count;
_dataSentRateChart.AddSample(avgStats.TotalDataSent);
_dataReceivedRateChart.AddSample(avgStats.TotalDataReceived);
// Gather network events
var events = ProfilingTools.EventsNetwork;
@@ -118,6 +164,8 @@ namespace FlaxEditor.Windows.Profiler
{
_dataSentChart.SelectedSampleIndex = selectedFrame;
_dataReceivedChart.SelectedSampleIndex = selectedFrame;
_dataSentRateChart.SelectedSampleIndex = selectedFrame;
_dataReceivedRateChart.SelectedSampleIndex = selectedFrame;
// Update events tables
if (_events != null)
@@ -257,6 +305,11 @@ namespace FlaxEditor.Windows.Profiler
return Utilities.Utils.FormatBytesCount((ulong)v);
}
private static string FormatSampleBytesRate(float v)
{
return Utilities.Utils.FormatBytesCount((ulong)v) + "/s";
}
private static string FormatCellBytes(object x)
{
return Utilities.Utils.FormatBytesCount((int)x);