// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "TraceServices/Model/NetProfiler.h" #include "Common/SlabAllocator.h" #include "Model/Tables.h" namespace TraceServices { class FAnalysisSessionLock; class FStringStore; struct FNetProfilerGameInstanceInternal { FNetProfilerGameInstance Instance; TPagedArray* Objects; TArray> Connections; TPagedArray* Frames; TPagedArray* FrameStats; uint32 ObjectsChangeCount; uint32 FramesChangeCount; }; struct FNetProfilerConnectionData { FNetProfilerConnectionData(ILinearAllocator& Allocator) : Packets(Allocator, 1024) , PacketStats(Allocator, 4096) , ContentEvents(Allocator, 8192) , PacketChangeCount(0u) , PacketStatsChangeCount(0u) , ContentEventChangeCount(0u) {} TPagedArray Packets; TPagedArray PacketStats; TPagedArray ContentEvents; uint32 PacketChangeCount; uint32 PacketStatsChangeCount; uint32 ContentEventChangeCount; }; struct FNetProfilerConnectionInternal { FNetProfilerConnection Connection; FNetProfilerConnectionData* Data[ENetProfilerConnectionMode::Count]; }; class FNetProfilerProvider : public INetProfilerProvider { public: explicit FNetProfilerProvider(IAnalysisSession& InSession); virtual ~FNetProfilerProvider(); void SetNetTraceVersion(uint32 NetTraceVersion); FNetProfilerNameIndexType AddNetProfilerName(const TCHAR* Name); uint32 AddNetProfilerEventType(uint32 NameIndex, uint32 Level); uint32 AddNetProfilerStatsCounterType(uint32 NameIndex, ENetProfilerStatsCounterType Type); FNetProfilerGameInstanceInternal& CreateGameInstance(); FNetProfilerGameInstanceInternal* EditGameInstance(uint32 GameInstanceIndex); void MarkGameInstancesDirty(); FNetProfilerConnectionInternal& CreateConnection(uint32 GameInstanceIndex); FNetProfilerConnectionInternal* EditConnection(uint32 ConnectionIndex); FNetProfilerConnectionData& EditConnectionData(uint32 ConnectionIndex, ENetProfilerConnectionMode Mode); void EditPacketDeliveryStatus(uint32 ConnectionIndex, ENetProfilerConnectionMode Mode, uint32 SequenceNumber, ENetProfilerDeliveryStatus DeliveryStatus); FNetProfilerObjectInstance& CreateObject(uint32 GameInstanceIndex); FNetProfilerObjectInstance* EditObject(uint32 GameInstanceIndex, uint32 ObjectIndex); // INetProfilerProvider Interface virtual uint32 GetNetTraceVersion() const override; // Access Names virtual uint32 GetNameCount() const override { return Names.Num(); } virtual void ReadNames(TFunctionRef Callback) const override; virtual void ReadName(uint32 NameIndex, TFunctionRef Callback) const override; // Access EventTypers virtual uint32 GetEventTypesCount() const override { return EventTypes.Num(); } virtual void ReadEventTypes(TFunctionRef Callback) const override; virtual void ReadEventType(uint32 EventTypeIndex, TFunctionRef Callback) const override; // Access GameInstances virtual uint32 GetGameInstanceCount() const override { return GameInstances.Num(); } virtual void ReadGameInstances(TFunctionRef Callback) const override; virtual uint32 GetGameInstanceChangeCount() const override { return GameInstanceChangeCount; } // Access Connections virtual uint32 GetConnectionCount(uint32 GameInstanceIndex) const override; virtual void ReadConnections(uint32 GameInstanceIndex, TFunctionRef Callback) const override; virtual void ReadConnection(uint32 ConnectionIndex, TFunctionRef Callback) const override; virtual uint32 GetConnectionChangeCount() const override { return ConnectionChangeCount; } // Access Object Instances virtual uint32 GetObjectCount(uint32 GameInstanceIndex) const override; virtual void ReadObjects(uint32 GameInstanceIndex, TFunctionRef Callback) const override; virtual void ReadObject(uint32 GameInstanceIndex, uint32 ObjectIndex, TFunctionRef Callback) const override; virtual uint32 GetObjectsChangeCount(uint32 GameInstanceIndex) const override; // Find Packet Index from SequenceNumber virtual int32 FindPacketIndexFromPacketSequence(uint32 ConnectionIndex, ENetProfilerConnectionMode Mode, uint32 SequenceNumber) const override; // Enumerate packets in the provided packet interval virtual uint32 GetPacketCount(uint32 ConnectionIndex, ENetProfilerConnectionMode Mode) const override; virtual void EnumeratePackets(uint32 ConnectionIndex, ENetProfilerConnectionMode Mode, uint32 PacketIndexIntervalStart, uint32 PacketIndexIntervalEnd, TFunctionRef Callback) const override; virtual uint32 GetPacketChangeCount(uint32 ConnectionIndex, ENetProfilerConnectionMode Mode) const override; // Enumerate packet content events by range virtual void EnumeratePacketContentEventsByIndex(uint32 ConnectionIndex, ENetProfilerConnectionMode Mode, uint32 StartEventIndex, uint32 EndEventIndex, TFunctionRef Callback) const override; virtual void EnumeratePacketContentEventsByPosition(uint32 ConnectionIndex, ENetProfilerConnectionMode Mode, uint32 PacketIndex, uint32 StartPos, uint32 EndPos, TFunctionRef Callback) const override; virtual uint32 GetPacketContentEventChangeCount(uint32 ConnectionIndex, ENetProfilerConnectionMode Mode) const override; // Access StatsCounterTypes virtual uint32 GetNetStatsCounterTypesCount() const override { return StatsCounterTypes.Num(); } virtual void ReadNetStatsCounterTypes(TFunctionRef Callback) const override; virtual void ReadNetStatsCounterType(uint32 TypeIndex, TFunctionRef Callback) const override; // Stats queries virtual ITable* CreateAggregation(uint32 ConnectionIndex, ENetProfilerConnectionMode Mode, uint32 PacketIndexIntervalStart, uint32 PacketIndexIntervalEnd, uint32 StartPosition, uint32 EndPosition) const override; virtual ITable* CreateStatsCountersAggregation(uint32 ConnectionIndex, ENetProfilerConnectionMode Mode, uint32 PacketIndexIntervalStart, uint32 PacketIndexIntervalEnd) const override; const TCHAR* InternalGetNetProfilerName(FNetProfilerNameIndexType NameIndex) const { return Names[NameIndex].Name; } private: const FNetProfilerName* GetNetProfilerName(FNetProfilerNameIndexType ProfilerNameId) const; const FNetProfilerEventType* GetNetProfilerEventType(uint32 ProfilerEventTypeId) const; const FNetProfilerStatsCounterType* GetNetProfilerStatsCounterType(uint32 ProfilerStatsCounterTypeId) const; IAnalysisSession& Session; TArray Names; TArray EventTypes; TArray StatsCounterTypes; // All GameInstances seen throughout the session TArray> GameInstances; // All connections we have seen throughout the session TPagedArray Connections; TTableLayout AggregatedStatsTableLayout; TTableLayout AggregatedStatsCounterStatsTableLayout; uint32 NetTraceVersion; uint32 ConnectionChangeCount; uint32 GameInstanceChangeCount; }; } // namespace TraceServices