forked from Ports/perfect_dark
port: net: only send player moves when needed; add stuff to net debug
This commit is contained in:
1 parent
8c2b15d649
commit
cbf65e53b9
1 file changed
+31
-5
+31
-5
@@ -58,6 +58,9 @@ static ENetAddress g_NetRemoteAddr;
|
|||||||
|
|
||||||
static u32 g_NetNextUpdate = 0;
|
static u32 g_NetNextUpdate = 0;
|
||||||
|
|
||||||
|
static u32 g_NetReliableFrameLen = 0;
|
||||||
|
static u32 g_NetUnreliableFrameLen = 0;
|
||||||
|
|
||||||
static s32 netParseAddr(ENetAddress *out, const char *str)
|
static s32 netParseAddr(ENetAddress *out, const char *str)
|
||||||
{
|
{
|
||||||
char tmp[256] = { 0 };
|
char tmp[256] = { 0 };
|
||||||
@@ -222,12 +225,25 @@ static inline s32 netClientNeedReliableMove(const struct netclient *cl)
|
|||||||
(moveprev->ucmd & UCMD_IMPORTANT_MASK) != (move->ucmd & UCMD_IMPORTANT_MASK);
|
(moveprev->ucmd & UCMD_IMPORTANT_MASK) != (move->ucmd & UCMD_IMPORTANT_MASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline s32 netClientNeedMove(const struct netclient *cl)
|
||||||
|
{
|
||||||
|
const struct netplayermove *move = &cl->outmove[0];
|
||||||
|
const struct netplayermove *moveprev = &cl->outmove[1];
|
||||||
|
if (move->tick && cl->outmoveack >= move->tick) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const u8 *cmpa = (const u8 *)move + sizeof(move->tick);
|
||||||
|
const u8 *cmpb = (const u8 *)moveprev + sizeof(move->tick);
|
||||||
|
return (memcmp(cmpa, cmpb, sizeof(*move) - sizeof(move->tick)) != 0);
|
||||||
|
}
|
||||||
|
|
||||||
static inline void netFlushSendBuffers(void)
|
static inline void netFlushSendBuffers(void)
|
||||||
{
|
{
|
||||||
if (g_NetMsgRel.wp) {
|
if (g_NetMsgRel.wp) {
|
||||||
if (g_NetMsgRel.error) {
|
if (g_NetMsgRel.error) {
|
||||||
sysLogPrintf(LOG_WARNING, "NET: reliable out buffer overflow");
|
sysLogPrintf(LOG_WARNING, "NET: reliable out buffer overflow");
|
||||||
}
|
}
|
||||||
|
g_NetReliableFrameLen += g_NetMsgRel.wp;
|
||||||
netSend(NULL, &g_NetMsgRel, true, NETCHAN_DEFAULT);
|
netSend(NULL, &g_NetMsgRel, true, NETCHAN_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -235,6 +251,7 @@ static inline void netFlushSendBuffers(void)
|
|||||||
if (g_NetMsg.error) {
|
if (g_NetMsg.error) {
|
||||||
sysLogPrintf(LOG_WARNING, "NET: unreliable out buffer overflow");
|
sysLogPrintf(LOG_WARNING, "NET: unreliable out buffer overflow");
|
||||||
}
|
}
|
||||||
|
g_NetUnreliableFrameLen += g_NetMsg.wp;
|
||||||
netSend(NULL, &g_NetMsg, false, NETCHAN_DEFAULT);
|
netSend(NULL, &g_NetMsg, false, NETCHAN_DEFAULT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -658,6 +675,9 @@ void netEndFrame(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_NetReliableFrameLen = 0;
|
||||||
|
g_NetUnreliableFrameLen = 0;
|
||||||
|
|
||||||
// send whatever messages have accumulated so far
|
// send whatever messages have accumulated so far
|
||||||
netFlushSendBuffers();
|
netFlushSendBuffers();
|
||||||
|
|
||||||
@@ -667,7 +687,10 @@ void netEndFrame(void)
|
|||||||
g_NetNextUpdate = g_NetTick + g_NetClientUpdateRate;
|
g_NetNextUpdate = g_NetTick + g_NetClientUpdateRate;
|
||||||
if (g_NetTick > 100) {
|
if (g_NetTick > 100) {
|
||||||
netClientRecordMove(g_NetLocalClient, g_NetLocalClient->player);
|
netClientRecordMove(g_NetLocalClient, g_NetLocalClient->player);
|
||||||
netmsgClcMoveWrite(netClientNeedReliableMove(g_NetLocalClient) ? &g_NetMsgRel : &g_NetMsg);
|
const bool needrel = netClientNeedReliableMove(g_NetLocalClient);
|
||||||
|
if (needrel || netClientNeedMove(g_NetLocalClient)) {
|
||||||
|
netmsgClcMoveWrite(needrel ? &g_NetMsgRel : &g_NetMsg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
g_NetNextUpdate = g_NetTick + g_NetServerUpdateRate;
|
g_NetNextUpdate = g_NetTick + g_NetServerUpdateRate;
|
||||||
@@ -675,7 +698,10 @@ void netEndFrame(void)
|
|||||||
struct netclient *cl = &g_NetClients[i];
|
struct netclient *cl = &g_NetClients[i];
|
||||||
if (cl->state >= CLSTATE_GAME && cl->player) {
|
if (cl->state >= CLSTATE_GAME && cl->player) {
|
||||||
netClientRecordMove(cl, cl->player);
|
netClientRecordMove(cl, cl->player);
|
||||||
netmsgSvcPlayerMoveWrite(netClientNeedReliableMove(g_NetLocalClient) ? &g_NetMsgRel : &g_NetMsg, cl);
|
const bool needrel = netClientNeedReliableMove(cl);
|
||||||
|
if (needrel || netClientNeedMove(cl)) {
|
||||||
|
netmsgSvcPlayerMoveWrite(needrel ? &g_NetMsgRel : &g_NetMsg, cl);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -835,10 +861,10 @@ Gfx *netDebugRender(Gfx *gdl)
|
|||||||
|
|
||||||
s32 x = 2;
|
s32 x = 2;
|
||||||
s32 y = viGetHeight() - 1 - 6*8;
|
s32 y = viGetHeight() - 1 - 6*8;
|
||||||
snprintf(tmp, sizeof(tmp), "Nettick: %u\nPing: %u\nSent: %u\nSend rate: %u\nRecv: %u\nRecv rate: %u\n",
|
snprintf(tmp, sizeof(tmp), "Nettick: %u\nPing: %u\nSent: %u\nRecv: %u\nReliable frame: %u\nUnreliable frame: %u\n",
|
||||||
g_NetTick, g_NetLocalClient->peer ? enet_peer_get_rtt(g_NetLocalClient->peer) : 0,
|
g_NetTick, g_NetLocalClient->peer ? enet_peer_get_rtt(g_NetLocalClient->peer) : 0,
|
||||||
enet_host_get_bytes_sent(g_NetHost), g_NetHost->outgoingBandwidth,
|
enet_host_get_bytes_sent(g_NetHost), enet_host_get_bytes_received(g_NetHost),
|
||||||
enet_host_get_bytes_received(g_NetHost), g_NetHost->incomingBandwidth);
|
g_NetReliableFrameLen, g_NetUnreliableFrameLen);
|
||||||
gdl = textRenderProjected(gdl, &x, &y, tmp, g_CharsHandelGothicXs, g_FontHandelGothicXs, 0x00ff00ff, viGetWidth(), viGetHeight(), 0, 0);
|
gdl = textRenderProjected(gdl, &x, &y, tmp, g_CharsHandelGothicXs, g_FontHandelGothicXs, 0x00ff00ff, viGetWidth(), viGetHeight(), 0, 0);
|
||||||
|
|
||||||
gSPClearExtraGeometryModeEXT(gdl++, G_ASPECT_CENTER_EXT);
|
gSPClearExtraGeometryModeEXT(gdl++, G_ASPECT_CENTER_EXT);
|
||||||
|
|||||||
Reference in new issue
Block a user