EM_Task/TraceInsights/Private/Insights/NetworkingProfiler/ViewModels/NetStatsViewColumnFactory.cpp

506 lines
21 KiB
C++
Raw Permalink Normal View History

2026-02-13 16:18:33 +08:00
// Copyright Epic Games, Inc. All Rights Reserved.
#include "NetStatsViewColumnFactory.h"
// Insights
#include "Insights/Table/ViewModels/TableCellValueFormatter.h"
#include "Insights/Table/ViewModels/TableCellValueGetter.h"
#include "Insights/Table/ViewModels/TableCellValueSorter.h"
#include "Insights/NetworkingProfiler/ViewModels/NetEventGroupingAndSorting.h"
#include "Insights/NetworkingProfiler/ViewModels/NetEventNodeHelper.h"
#define LOCTEXT_NAMESPACE "SNetStatsView"
////////////////////////////////////////////////////////////////////////////////////////////////////
// Column identifiers
const FName FNetStatsViewColumns::NameColumnID(TEXT("Name")); // TEXT("_Hierarchy")
const FName FNetStatsViewColumns::TypeColumnID(TEXT("Type"));
const FName FNetStatsViewColumns::LevelColumnID(TEXT("Level"));
const FName FNetStatsViewColumns::InstanceCountColumnID(TEXT("Count"));
// Inclusive columns
const FName FNetStatsViewColumns::TotalInclusiveSizeColumnID(TEXT("TotalIncl"));
const FName FNetStatsViewColumns::MaxInclusiveSizeColumnID(TEXT("MaxIncl"));
const FName FNetStatsViewColumns::AverageInclusiveSizeColumnID(TEXT("AverageIncl"));
// Exclusive columns
const FName FNetStatsViewColumns::TotalExclusiveSizeColumnID(TEXT("TotalExcl"));
const FName FNetStatsViewColumns::MaxExclusiveSizeColumnID(TEXT("MaxExcl"));
const FName FNetStatsViewColumns::AverageExclusiveSizeColumnID(TEXT("AverageExcl"));
////////////////////////////////////////////////////////////////////////////////////////////////////
void FNetStatsViewColumnFactory::CreateNetStatsViewColumns(TArray<TSharedRef<Insights::FTableColumn>>& Columns)
{
Columns.Reset();
Columns.Add(CreateNameColumn());
Columns.Add(CreateTypeColumn());
Columns.Add(CreateLevelColumn());
Columns.Add(CreateInstanceCountColumn());
Columns.Add(CreateTotalInclusiveSizeColumn());
Columns.Add(CreateMaxInclusiveSizeColumn());
Columns.Add(CreateAverageInclusiveSizeColumn());
Columns.Add(CreateTotalExclusiveSizeColumn());
Columns.Add(CreateMaxExclusiveSizeColumn());
// Columns.Add(CreateAverageExclusiveSizeColumn());
}
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FNetStatsViewColumnFactory::CreateNameColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FNetStatsViewColumns::NameColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("Name_ColumnName", "Name"));
Column.SetTitleName(LOCTEXT("Name_ColumnTitle", "NetEvent or Group Name"));
Column.SetDescription(LOCTEXT("Name_ColumnDesc", "Name of the timer or group"));
Column.SetFlags(ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered |
ETableColumnFlags::IsHierarchy);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(206.0f);
Column.SetMinWidth(42.0f);
Column.SetDataType(ETableCellDataType::Text);
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FDisplayNameValueGetter>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FTextValueFormatter>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByName>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FNetStatsViewColumnFactory::CreateTypeColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FNetStatsViewColumns::TypeColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("Type_ColumnName", "Type"));
Column.SetTitleName(LOCTEXT("Type_ColumnTitle", "Type"));
Column.SetDescription(LOCTEXT("Type_ColumnDesc", "Type of timer or group"));
Column.SetFlags(ETableColumnFlags::CanBeHidden |
// ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(60.0f);
Column.SetDataType(ETableCellDataType::Text);
class FNetEventTypeValueGetter: public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const
{
ensure(Column.GetId() == FNetStatsViewColumns::TypeColumnID);
const FNetEventNode& NetEventNode = static_cast<const FNetEventNode&>(Node);
return TOptional<FTableCellValue>(FTableCellValue(NetEventNodeTypeHelper::ToText(NetEventNode.GetType())));
}
};
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FNetEventTypeValueGetter>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FTextValueFormatter>();
Column.SetValueFormatter(Formatter);
// TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByTextValue>(ColumnRef);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FNetEventNodeSortingByEventType>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FNetStatsViewColumnFactory::CreateLevelColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FNetStatsViewColumns::LevelColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("Level_ColumnName", "Level"));
Column.SetTitleName(LOCTEXT("Level_ColumnTitle", "Level"));
Column.SetDescription(LOCTEXT("Level_ColumnDesc", "Level of net event instances"));
Column.SetFlags(ETableColumnFlags::CanBeHidden |
ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Right);
Column.SetInitialWidth(40.0f);
Column.SetDataType(ETableCellDataType::Int64);
class FLevelValueGetter: public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const
{
ensure(Column.GetId() == FNetStatsViewColumns::LevelColumnID);
const FNetEventNode& NetEventNode = static_cast<const FNetEventNode&>(Node);
return TOptional<FTableCellValue>(FTableCellValue(static_cast<int64>(NetEventNode.GetLevel())));
}
};
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FLevelValueGetter>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FInt64ValueFormatterAsNumber>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByInt64Value>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FNetStatsViewColumnFactory::CreateInstanceCountColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FNetStatsViewColumns::InstanceCountColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("InstanceCount_ColumnName", "Count"));
Column.SetTitleName(LOCTEXT("InstanceCount_ColumnTitle", "Instance Count"));
Column.SetDescription(LOCTEXT("InstanceCount_ColumnDesc", "Number of net event instances"));
Column.SetFlags(ETableColumnFlags::CanBeHidden |
ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Right);
Column.SetInitialWidth(60.0f);
Column.SetDataType(ETableCellDataType::Int64);
class FInstanceCountValueGetter: public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const
{
ensure(Column.GetId() == FNetStatsViewColumns::InstanceCountColumnID);
const FNetEventNode& NetEventNode = static_cast<const FNetEventNode&>(Node);
return TOptional<FTableCellValue>(FTableCellValue(static_cast<int64>(NetEventNode.GetAggregatedStats().InstanceCount)));
}
};
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FInstanceCountValueGetter>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FInt64ValueFormatterAsNumber>();
Column.SetValueFormatter(Formatter);
// TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByInt64Value>(ColumnRef);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FNetEventNodeSortingByInstanceCount>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// Inclusive Columns
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FNetStatsViewColumnFactory::CreateTotalInclusiveSizeColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FNetStatsViewColumns::TotalInclusiveSizeColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("TotalInclusive_ColumnName", "Incl"));
Column.SetTitleName(LOCTEXT("TotalInclusive_ColumnTitle", "Total Inclusive Size"));
Column.SetDescription(LOCTEXT("TotalInclusive_ColumnDesc", "Total inclusive size (bits) of selected net event instances"));
Column.SetFlags(ETableColumnFlags::CanBeHidden |
ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Right);
Column.SetInitialWidth(TotalSizeColumnInitialWidth);
Column.SetDataType(ETableCellDataType::Int64);
Column.SetAggregation(ETableColumnAggregation::Sum);
class FTotalInclusiveValueGetter: public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const
{
ensure(Column.GetId() == FNetStatsViewColumns::TotalInclusiveSizeColumnID);
const FNetEventNode& NetEventNode = static_cast<const FNetEventNode&>(Node);
return TOptional<FTableCellValue>(FTableCellValue(static_cast<int64>(NetEventNode.GetAggregatedStats().TotalInclusive)));
}
};
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTotalInclusiveValueGetter>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FInt64ValueFormatterAsNumber>();
Column.SetValueFormatter(Formatter);
// TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByInt64Value>(ColumnRef);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FNetEventNodeSortingByTotalInclusiveSize>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FNetStatsViewColumnFactory::CreateMaxInclusiveSizeColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FNetStatsViewColumns::MaxInclusiveSizeColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("MaxInclusive_ColumnName", "I.Max"));
Column.SetTitleName(LOCTEXT("MaxInclusive_ColumnTitle", "Max Inclusive Size"));
Column.SetDescription(LOCTEXT("MaxInclusive_ColumnDesc", "Maximum inclusive size (bits) of selected net event instances"));
Column.SetFlags(ETableColumnFlags::CanBeHidden |
// ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Right);
Column.SetInitialWidth(SizeColumnInitialWidth);
Column.SetDataType(ETableCellDataType::Int64);
class FMaxInclusiveValueGetter: public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const
{
ensure(Column.GetId() == FNetStatsViewColumns::MaxInclusiveSizeColumnID);
const FNetEventNode& NetEventNode = static_cast<const FNetEventNode&>(Node);
return TOptional<FTableCellValue>(FTableCellValue(static_cast<int64>(NetEventNode.GetAggregatedStats().MaxInclusive)));
}
};
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FMaxInclusiveValueGetter>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FInt64ValueFormatterAsNumber>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByInt64Value>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FNetStatsViewColumnFactory::CreateAverageInclusiveSizeColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FNetStatsViewColumns::AverageInclusiveSizeColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("AvgInclusive_ColumnName", "I.Avg"));
Column.SetTitleName(LOCTEXT("AvgInclusive_ColumnTitle", "Average Inclusive Size"));
Column.SetDescription(LOCTEXT("AvgInclusive_ColumnDesc", "Average inclusive size (bits) of selected net event instances"));
Column.SetFlags(ETableColumnFlags::CanBeHidden |
// ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Right);
Column.SetInitialWidth(SizeColumnInitialWidth);
Column.SetDataType(ETableCellDataType::Int64);
class FAverageInclusiveValueGetter: public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const
{
ensure(Column.GetId() == FNetStatsViewColumns::AverageInclusiveSizeColumnID);
const FNetEventNode& NetEventNode = static_cast<const FNetEventNode&>(Node);
return TOptional<FTableCellValue>(FTableCellValue(static_cast<int64>(NetEventNode.GetAggregatedStats().AverageInclusive)));
}
};
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FAverageInclusiveValueGetter>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FInt64ValueFormatterAsNumber>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByInt64Value>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// Exclusive Columns
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FNetStatsViewColumnFactory::CreateTotalExclusiveSizeColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FNetStatsViewColumns::TotalExclusiveSizeColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("TotalExclusive_ColumnName", "Excl"));
Column.SetTitleName(LOCTEXT("TotalExclusive_ColumnTitle", "Total Exclusive Size"));
Column.SetDescription(LOCTEXT("TotalExclusive_ColumnDesc", "Total exclusive size (bits) of selected net event instances"));
Column.SetFlags(ETableColumnFlags::CanBeHidden |
ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Right);
Column.SetInitialWidth(TotalSizeColumnInitialWidth);
Column.SetDataType(ETableCellDataType::Int64);
Column.SetAggregation(ETableColumnAggregation::Sum);
class FTotalExclusiveValueGetter: public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const
{
ensure(Column.GetId() == FNetStatsViewColumns::TotalExclusiveSizeColumnID);
const FNetEventNode& NetEventNode = static_cast<const FNetEventNode&>(Node);
return TOptional<FTableCellValue>(FTableCellValue(static_cast<int64>(NetEventNode.GetAggregatedStats().TotalExclusive)));
}
};
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FTotalExclusiveValueGetter>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FInt64ValueFormatterAsNumber>();
Column.SetValueFormatter(Formatter);
// TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByInt64Value(ColumnRef));
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FNetEventNodeSortingByTotalExclusiveSize>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FNetStatsViewColumnFactory::CreateMaxExclusiveSizeColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FNetStatsViewColumns::MaxExclusiveSizeColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("MaxExclusive_ColumnName", "E.Max"));
Column.SetTitleName(LOCTEXT("MaxExclusive_ColumnTitle", "Max Exclusive Size"));
Column.SetDescription(LOCTEXT("MaxExclusive_ColumnDesc", "Maximum exclusive size (bits) of selected net event instances"));
Column.SetFlags(ETableColumnFlags::CanBeHidden |
// ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Right);
Column.SetInitialWidth(SizeColumnInitialWidth);
Column.SetDataType(ETableCellDataType::Int64);
class FMaxExclusiveValueGetter: public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const
{
ensure(Column.GetId() == FNetStatsViewColumns::MaxExclusiveSizeColumnID);
const FNetEventNode& NetEventNode = static_cast<const FNetEventNode&>(Node);
return TOptional<FTableCellValue>(FTableCellValue(static_cast<int64>(NetEventNode.GetAggregatedStats().MaxExclusive)));
}
};
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FMaxExclusiveValueGetter>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FInt64ValueFormatterAsNumber>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByInt64Value>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FNetStatsViewColumnFactory::CreateAverageExclusiveSizeColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FNetStatsViewColumns::AverageExclusiveSizeColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("AvgExclusive_ColumnName", "E.Avg"));
Column.SetTitleName(LOCTEXT("AvgExclusive_ColumnTitle", "Average Exclusive Size)"));
Column.SetDescription(LOCTEXT("AvgExclusive_ColumnDesc", "Average exclusive size (bits) of selected net event instances"));
Column.SetFlags(ETableColumnFlags::CanBeHidden |
// ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Right);
Column.SetInitialWidth(SizeColumnInitialWidth);
Column.SetDataType(ETableCellDataType::Int64);
class FAverageExclusiveValueGetter: public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const
{
ensure(Column.GetId() == FNetStatsViewColumns::AverageExclusiveSizeColumnID);
const FNetEventNode& NetEventNode = static_cast<const FNetEventNode&>(Node);
// return TOptional<FTableCellValue>(FTableCellValue(static_cast<int64>(NetEventNode.GetAggregatedStats().AverageExclusive)));
return TOptional<FTableCellValue>(FTableCellValue(int64(0)));
}
};
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FAverageExclusiveValueGetter>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FInt64ValueFormatterAsNumber>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByInt64Value>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
#undef LOCTEXT_NAMESPACE