Skip to content

Commit 4ce1707

Browse files
committed
dev: improve netdebug, fix missing imgui PopStyleVar
1 parent cc9afd9 commit 4ce1707

File tree

4 files changed

+122
-31
lines changed

4 files changed

+122
-31
lines changed

code/components/debug-net/src/NetDebug.cpp

+83-12
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,64 @@ const int g_netOverlayHeight = 300;
2828
const int g_netOverlaySampleSize = 200; // milliseconds per sample frame
2929
const int g_netOverlaySampleCount = 150;
3030

31+
class RageHashList
32+
{
33+
public:
34+
template<int Size>
35+
RageHashList(const char* (&list)[Size])
36+
{
37+
for (int i = 0; i < Size; i++)
38+
{
39+
m_lookupList.insert({ HashRageString(list[i]), list[i] });
40+
}
41+
}
42+
43+
inline std::string LookupHash(uint32_t hash)
44+
{
45+
auto it = m_lookupList.find(hash);
46+
47+
if (it != m_lookupList.end())
48+
{
49+
return std::string(it->second);
50+
}
51+
52+
return fmt::sprintf("0x%08x", hash);
53+
}
54+
55+
private:
56+
std::map<uint32_t, std::string_view> m_lookupList;
57+
};
58+
59+
static const char* g_knownPackets[]
60+
{
61+
"msgConVars",
62+
"msgEnd",
63+
"msgEntityCreate",
64+
"msgNetGameEvent",
65+
"msgObjectIds",
66+
"msgPackedAcks",
67+
"msgPackedClones",
68+
"msgPaymentRequest",
69+
"msgRequestObjectIds",
70+
"msgResStart",
71+
"msgResStop",
72+
"msgRoute",
73+
"msgRpcEntityCreation",
74+
"msgRpcNative",
75+
"msgServerCommand",
76+
"msgServerEvent",
77+
"msgTimeSync",
78+
"msgTimeSyncReq",
79+
"msgWorldGrid",
80+
"msgFrame",
81+
"msgIHost",
82+
"gameStateAck",
83+
"msgNetEvent",
84+
"msgServerEvent",
85+
};
86+
87+
static RageHashList g_hashes{ g_knownPackets };
88+
3189
class NetOverlayMetricSink : public INetMetricSink
3290
{
3391
public:
@@ -45,9 +103,9 @@ class NetOverlayMetricSink : public INetMetricSink
45103

46104
virtual void OnRouteDelayResult(int msec) override;
47105

48-
virtual void OnIncomingCommand(uint32_t type, size_t size) override;
106+
virtual void OnIncomingCommand(uint32_t type, size_t size, bool reliable) override;
49107

50-
virtual void OnOutgoingCommand(uint32_t type, size_t size) override;
108+
virtual void OnOutgoingCommand(uint32_t type, size_t size, bool reliable) override;
51109

52110
virtual void OverrideBandwidthStats(uint32_t in, uint32_t out) override;
53111

@@ -93,6 +151,10 @@ class NetOverlayMetricSink : public INetMetricSink
93151

94152
std::mutex m_metricMutex;
95153

154+
std::map<uint32_t, bool> m_incomingReliable;
155+
156+
std::map<uint32_t, bool> m_outgoingReliable;
157+
96158
std::map<uint32_t, size_t> m_incomingMetrics;
97159

98160
std::map<uint32_t, size_t> m_outgoingMetrics;
@@ -204,13 +266,16 @@ NetOverlayMetricSink::NetOverlayMetricSink()
204266
static bool showIncoming = true;
205267
static bool showOutgoing = true;
206268

207-
auto showList = [](const decltype(m_lastIncomingMetrics)& list)
269+
auto showList = [](const decltype(m_lastIncomingMetrics)& list, const decltype(m_incomingReliable)& reliable)
208270
{
209-
ImGui::Columns(2);
271+
ImGui::Columns(3);
210272

211273
for (auto& entry : list)
212274
{
213-
ImGui::Text("0x%08x", entry.first);
275+
ImGui::Text("%s", (reliable.find(entry.first)->second ? "R" : "U"));
276+
ImGui::NextColumn();
277+
278+
ImGui::Text("%s", g_hashes.LookupHash(entry.first));
214279
ImGui::NextColumn();
215280

216281
ImGui::Text("%d B", entry.second);
@@ -222,12 +287,12 @@ NetOverlayMetricSink::NetOverlayMetricSink()
222287

223288
if (ImGui::CollapsingHeader("Incoming", &showIncoming))
224289
{
225-
showList(m_lastIncomingMetrics);
290+
showList(m_lastIncomingMetrics, m_incomingReliable);
226291
}
227292

228293
if (ImGui::CollapsingHeader("Outgoing", &showOutgoing))
229294
{
230-
showList(m_lastOutgoingMetrics);
295+
showList(m_lastOutgoingMetrics, m_outgoingReliable);
231296
}
232297
}
233298

@@ -293,16 +358,18 @@ void NetOverlayMetricSink::OnRouteDelayResult(int msec)
293358
m_inRouteDelayMax = *std::max_element(m_inRouteDelaySamplesArchive, m_inRouteDelaySamplesArchive + _countof(m_inRouteDelaySamplesArchive));
294359
}
295360

296-
void NetOverlayMetricSink::OnIncomingCommand(uint32_t type, size_t size)
361+
void NetOverlayMetricSink::OnIncomingCommand(uint32_t type, size_t size, bool reliable)
297362
{
298363
std::unique_lock<std::mutex> lock(m_metricMutex);
299364
m_incomingMetrics[type] += size;
365+
m_incomingReliable[type] = reliable;
300366
}
301367

302-
void NetOverlayMetricSink::OnOutgoingCommand(uint32_t type, size_t size)
368+
void NetOverlayMetricSink::OnOutgoingCommand(uint32_t type, size_t size, bool reliable)
303369
{
304370
std::unique_lock<std::mutex> lock(m_metricMutex);
305371
m_outgoingMetrics[type] += size;
372+
m_outgoingReliable[type] = reliable;
306373
}
307374

308375
// log data if enabled
@@ -407,14 +474,16 @@ void NetOverlayMetricSink::DrawGraph()
407474
{
408475
"Routed Messages",
409476
"Reliables",
410-
"Misc"
477+
"Misc",
478+
"Overhead"
411479
};
412480

413481
static const ImColor colors[NET_PACKET_SUB_MAX] =
414482
{
415483
GetColorIndex(0),
416484
GetColorIndex(1),
417-
GetColorIndex(2)
485+
GetColorIndex(2),
486+
GetColorIndex(3)
418487
};
419488

420489
struct DataContext
@@ -426,12 +495,14 @@ void NetOverlayMetricSink::DrawGraph()
426495
auto data0 = DataContext{ m_metrics, NET_PACKET_SUB_ROUTED_MESSAGES };
427496
auto data1 = DataContext{ m_metrics, NET_PACKET_SUB_RELIABLES };
428497
auto data2 = DataContext{ m_metrics, NET_PACKET_SUB_MISC };
498+
auto data3 = DataContext{ m_metrics, NET_PACKET_SUB_OVERHEAD };
429499

430500
const void* datas[NET_PACKET_SUB_MAX] =
431501
{
432502
&data0,
433503
&data1,
434-
&data2
504+
&data2,
505+
&data3
435506
};
436507

437508
ImGui::PlotMultiLines("Net Bw", NET_PACKET_SUB_MAX, names, colors, [](const void* cxt, int idx) -> float

code/components/devtools-five/src/DrawFPS.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ static InitFunction initFunction([]()
6767
}
6868
}
6969

70+
ImGui::PopStyleVar();
7071
ImGui::End();
7172
});
7273
});

code/components/net/include/INetMetricSink.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ class INetMetricSink : public fwRefCountable
2828

2929
virtual void OnRouteDelayResult(int msec) = 0;
3030

31-
virtual void OnIncomingCommand(uint32_t type, size_t size) = 0;
31+
virtual void OnIncomingCommand(uint32_t type, size_t size, bool reliable = false) = 0;
3232

33-
virtual void OnOutgoingCommand(uint32_t type, size_t size) = 0;
33+
virtual void OnOutgoingCommand(uint32_t type, size_t size, bool reliable = false) = 0;
3434

3535
virtual void OverrideBandwidthStats(uint32_t in, uint32_t out) = 0;
3636
};
@@ -40,6 +40,7 @@ enum NetPacketSubComponent
4040
NET_PACKET_SUB_ROUTED_MESSAGES,
4141
NET_PACKET_SUB_RELIABLES,
4242
NET_PACKET_SUB_MISC,
43+
NET_PACKET_SUB_OVERHEAD,
4344
NET_PACKET_SUB_MAX
4445
};
4546

code/components/net/src/NetLibraryImplV2.cpp

+35-17
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class NetLibraryImplV2 : public NetLibraryImplBase
3737
virtual bool IsDisconnected() override;
3838

3939
private:
40-
void ProcessPacket(const uint8_t* data, size_t size);
40+
void ProcessPacket(const uint8_t* data, size_t size, NetPacketMetrics& metrics, ENetPacketFlag flags);
4141

4242
private:
4343
std::string m_connectData;
@@ -122,7 +122,7 @@ void NetLibraryImplV2::SendReliableCommand(uint32_t type, const char* buffer, si
122122
enet_peer_send(m_serverPeer, 0, packet);
123123
}
124124

125-
m_base->GetMetricSink()->OnOutgoingCommand(type, length);
125+
m_base->GetMetricSink()->OnOutgoingCommand(type, length, true);
126126
}
127127

128128
void NetLibraryImplV2::SendData(const NetAddress& netAddress, const char* data, size_t length)
@@ -164,6 +164,7 @@ void NetLibraryImplV2::Flush()
164164
void NetLibraryImplV2::RunFrame()
165165
{
166166
uint32_t inDataSize = 0;
167+
NetPacketMetrics inMetrics;
167168

168169
ENetEvent event;
169170

@@ -183,7 +184,7 @@ void NetLibraryImplV2::RunFrame()
183184
}
184185
case ENET_EVENT_TYPE_RECEIVE:
185186
{
186-
ProcessPacket(event.packet->data, event.packet->dataLength);
187+
ProcessPacket(event.packet->data, event.packet->dataLength, inMetrics, (ENetPacketFlag)event.packet->flags);
187188
inDataSize += event.packet->dataLength;
188189

189190
enet_packet_destroy(event.packet);
@@ -224,7 +225,7 @@ void NetLibraryImplV2::RunFrame()
224225

225226
enet_peer_send(m_serverPeer, 1, enet_packet_create(msg.GetBuffer(), msg.GetCurLength(), ENET_PACKET_FLAG_UNSEQUENCED));
226227

227-
m_base->GetMetricSink()->OnOutgoingCommand(0xE938445B, packet.payload.size() + 4);
228+
m_base->GetMetricSink()->OnOutgoingCommand(0xE938445B, packet.payload.size() + 4, false);
228229
m_base->GetMetricSink()->OnOutgoingRoutePackets(1);
229230
}
230231

@@ -244,18 +245,18 @@ void NetLibraryImplV2::RunFrame()
244245
// update received metrics
245246
if (m_host->totalReceivedData != 0)
246247
{
247-
for (uint32_t i = 0; i < m_host->totalReceivedPackets; ++i)
248-
{
249-
NetPacketMetrics m;
250-
m.AddElementSize(NET_PACKET_SUB_MISC, inDataSize);
248+
// actually: overhead
249+
inMetrics.AddElementSize(NET_PACKET_SUB_OVERHEAD, m_host->totalReceivedData - inDataSize);
251250

252-
// actually: overhead
253-
m.AddElementSize(NET_PACKET_SUB_RELIABLES, m_host->totalReceivedData - inDataSize);
251+
m_base->GetMetricSink()->OnIncomingPacket(inMetrics);
254252

255-
m_base->GetMetricSink()->OnIncomingPacket(m);
253+
m_host->totalReceivedData = 0;
254+
inDataSize = 0;
256255

257-
m_host->totalReceivedData = 0;
258-
inDataSize = 0;
256+
for (uint32_t i = 1; i < m_host->totalReceivedPackets; ++i)
257+
{
258+
NetPacketMetrics m;
259+
m_base->GetMetricSink()->OnIncomingPacket(m);
259260
}
260261

261262
m_base->AddReceiveTick();
@@ -297,7 +298,7 @@ void NetLibraryImplV2::SendConnect(const std::string& connectData)
297298
#endif
298299
}
299300

300-
void NetLibraryImplV2::ProcessPacket(const uint8_t* data, size_t size)
301+
void NetLibraryImplV2::ProcessPacket(const uint8_t* data, size_t size, NetPacketMetrics& metrics, ENetPacketFlag flags)
301302
{
302303
NetBuffer msg((char*)data, size);
303304
uint32_t msgType = msg.Read<uint32_t>();
@@ -358,9 +359,9 @@ void NetLibraryImplV2::ProcessPacket(const uint8_t* data, size_t size)
358359
return;
359360
}
360361

361-
m_base->GetMetricSink()->OnIncomingCommand(msgType, size);
362+
m_base->GetMetricSink()->OnIncomingCommand(msgType, size, (flags & ENET_PACKET_FLAG_RELIABLE) != 0);
362363

363-
if (msgType == 0xE938445B) // 'msgRoute'
364+
if (msgType == HashRageString("msgRoute")) // 'msgRoute'
364365
{
365366
uint16_t netID = msg.Read<uint16_t>();
366367
uint16_t rlength = msg.Read<uint16_t>();
@@ -377,9 +378,26 @@ void NetLibraryImplV2::ProcessPacket(const uint8_t* data, size_t size)
377378

378379
// add to metrics
379380
m_base->GetMetricSink()->OnIncomingRoutePackets(1);
381+
382+
// add as routed message
383+
metrics.AddElementSize(NET_PACKET_SUB_ROUTED_MESSAGES, size);
380384
}
381-
else if (msgType != 0xCA569E63) // reliable command
385+
else if (msgType != HashRageString("msgEnd")) // reliable command
382386
{
387+
auto subType = NET_PACKET_SUB_MISC;
388+
389+
// cloning data is considered routing
390+
if (msgType == HashRageString("msgPackedAcks") || msgType == HashRageString("msgPackedClones"))
391+
{
392+
subType = NET_PACKET_SUB_ROUTED_MESSAGES;
393+
}
394+
else if (flags & ENET_PACKET_FLAG_RELIABLE)
395+
{
396+
subType = NET_PACKET_SUB_RELIABLES;
397+
}
398+
399+
metrics.AddElementSize(subType, size);
400+
383401
size_t reliableSize = size - 4;
384402

385403
std::vector<char> reliableBuf(reliableSize);

0 commit comments

Comments
 (0)