Skip to content
This repository was archived by the owner on Jan 5, 2024. It is now read-only.

Commit da095e7

Browse files
authored
Merge pull request #528 from cortex-command-community/NetworkInputLagFix
Fix Server Input lag
2 parents 18acfdc + e44f4a1 commit da095e7

File tree

10 files changed

+156
-157
lines changed

10 files changed

+156
-157
lines changed

Main.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -255,17 +255,15 @@ namespace RTE {
255255
while (!System::IsSetToQuit()) {
256256
bool serverUpdated = false;
257257
updateStartTime = g_TimerMan.GetAbsoluteTime();
258+
PollSDLEvents();
259+
g_WindowMan.Update();
258260

259261
g_TimerMan.Update();
260262

261263
// Simulation update, as many times as the fixed update step allows in the span since last frame draw.
262264
while (g_TimerMan.TimeForSimUpdate()) {
263265
serverUpdated = false;
264266

265-
PollSDLEvents();
266-
267-
g_WindowMan.Update();
268-
269267
g_PerformanceMan.NewPerformanceSample();
270268
g_PerformanceMan.UpdateMSPSU();
271269
g_TimerMan.UpdateSim();
@@ -378,6 +376,10 @@ int main(int argc, char **argv) {
378376

379377
HandleMainArgs(argc, argv);
380378

379+
if (g_NetworkServer.IsServerModeEnabled()) {
380+
SDL_ShowCursor(SDL_ENABLE);
381+
}
382+
381383
g_PresetMan.LoadAllDataModules();
382384

383385
if (!System::IsInExternalModuleValidationMode()) {

Managers/NetworkClient.cpp

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -228,17 +228,10 @@ namespace RTE {
228228
msg.MouseY = static_cast<int>(mouse.GetY());
229229

230230
// Those are update in Update every frame to catch short events like clicks and releases
231-
msg.MouseButtonPressed[MOUSE_LEFT] = m_MouseButtonPressedState[MOUSE_LEFT] == 1 ? true : false;
232-
msg.MouseButtonPressed[MOUSE_MIDDLE] = m_MouseButtonPressedState[MOUSE_MIDDLE] == 1 ? true : false;
233-
msg.MouseButtonPressed[MOUSE_RIGHT] = m_MouseButtonPressedState[MOUSE_RIGHT] == 1 ? true : false;
234231

235-
msg.MouseButtonReleased[MOUSE_LEFT] = m_MouseButtonReleasedState[MOUSE_LEFT] == 1 ? true : false;
236-
msg.MouseButtonReleased[MOUSE_MIDDLE] = m_MouseButtonReleasedState[MOUSE_MIDDLE] == 1 ? true : false;
237-
msg.MouseButtonReleased[MOUSE_RIGHT] = m_MouseButtonReleasedState[MOUSE_RIGHT] == 1 ? true : false;
238-
239-
msg.MouseButtonHeld[MOUSE_LEFT] = g_UInputMan.MouseButtonHeld(MOUSE_LEFT, -1);
240-
msg.MouseButtonHeld[MOUSE_MIDDLE] = g_UInputMan.MouseButtonHeld(MOUSE_MIDDLE, -1);
241-
msg.MouseButtonHeld[MOUSE_RIGHT] = g_UInputMan.MouseButtonHeld(MOUSE_RIGHT, -1);
232+
msg.MouseButtonState[MOUSE_LEFT] = g_UInputMan.MouseButtonHeld(MOUSE_LEFT, -1);
233+
msg.MouseButtonState[MOUSE_MIDDLE] = g_UInputMan.MouseButtonHeld(MOUSE_MIDDLE, -1);
234+
msg.MouseButtonState[MOUSE_RIGHT] = g_UInputMan.MouseButtonHeld(MOUSE_RIGHT, -1);
242235

243236
for (int i = 0; i < MAX_MOUSE_BUTTONS; i++) {
244237
m_MouseButtonPressedState[i] = -1;
@@ -251,20 +244,16 @@ namespace RTE {
251244
msg.MouseWheelMoved = 0;
252245
}
253246

254-
msg.InputElementHeld = 0;
255-
msg.InputElementPressed = 0;
256-
msg.InputElementReleased = 0;
247+
msg.InputElementState = 0;
257248

258-
msg.ResetActivityVote = g_UInputMan.KeyHeld(KEY_BACKSPACE) ? true : false;
259-
msg.RestartActivityVote = g_UInputMan.KeyHeld(KEY_BACKSLASH) ? true : false;
249+
msg.ResetActivityVote = g_UInputMan.KeyHeld(SDLK_BACKSPACE) ? true : false;
250+
msg.RestartActivityVote = g_UInputMan.KeyHeld(SDLK_BACKSLASH) ? true : false;
260251

261252
unsigned int bitMask = 0x1;
262253

263254
// Store element states as bit flags
264255
for (int i = 0; i < INPUT_COUNT; i++) {
265-
if (g_UInputMan.ElementHeld(0, i)) { msg.InputElementHeld = msg.InputElementHeld | bitMask; }
266-
if (g_UInputMan.NetworkAccumulatedElementPressed(i)) { msg.InputElementPressed = msg.InputElementPressed | bitMask; }
267-
if (g_UInputMan.NetworkAccumulatedElementReleased(i)) { msg.InputElementReleased = msg.InputElementReleased | bitMask; }
256+
if (g_UInputMan.ElementHeld(0, i)) { msg.InputElementState = msg.InputElementState | bitMask; }
268257

269258
bitMask <<= 1;
270259
}

Managers/NetworkClient.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,8 @@ namespace RTE {
191191
int m_SceneWidth; //!<
192192
int m_SceneHeight; //!<
193193

194-
int m_MouseButtonPressedState[3]; //!<
195-
int m_MouseButtonReleasedState[3]; //!<
194+
int m_MouseButtonPressedState[MAX_MOUSE_BUTTONS]; //!<
195+
int m_MouseButtonReleasedState[MAX_MOUSE_BUTTONS]; //!<
196196
int m_MouseWheelMoved; //!< Whether the mouse wheel was moved this Update. Used to make mouse wheel detection better.
197197

198198
private:

Managers/NetworkServer.cpp

Lines changed: 29 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -500,18 +500,14 @@ namespace RTE {
500500
msg.MouseX = m->MouseX;
501501
msg.MouseY = m->MouseY;
502502
for (int i = 0; i < MAX_MOUSE_BUTTONS; i++) {
503-
msg.MouseButtonPressed[i] = m->MouseButtonPressed[i];
504-
msg.MouseButtonReleased[i] = m->MouseButtonReleased[i];
505-
msg.MouseButtonHeld[i] = m->MouseButtonHeld[i];
503+
msg.MouseButtonState[i] = m->MouseButtonState[i];
506504
}
507505
msg.ResetActivityVote = m->ResetActivityVote;
508506
msg.RestartActivityVote = m->RestartActivityVote;
509507

510508
msg.MouseWheelMoved = m->MouseWheelMoved;
511509

512-
msg.InputElementPressed = m->InputElementPressed;
513-
msg.InputElementReleased = m->InputElementReleased;
514-
msg.InputElementHeld = m->InputElementHeld;
510+
msg.InputElementState = m->InputElementState;
515511

516512
bool skip = true;
517513

@@ -522,23 +518,19 @@ namespace RTE {
522518
if (msg.MouseY != lastmsg.MouseY) { skip = false; }
523519

524520
for (int i = 0; i < MAX_MOUSE_BUTTONS; i++) {
525-
if (msg.MouseButtonPressed[i] != lastmsg.MouseButtonPressed[i]) { skip = false; }
526-
if (msg.MouseButtonReleased[i] != lastmsg.MouseButtonReleased[i]) { skip = false; }
527-
if (msg.MouseButtonHeld[i] != lastmsg.MouseButtonHeld[i]) { skip = false; }
521+
if (msg.MouseButtonState[i] != lastmsg.MouseButtonState[i]) { skip = false; }
528522
}
529523
if (msg.ResetActivityVote != lastmsg.ResetActivityVote) { skip = false; }
530524
if (msg.RestartActivityVote != lastmsg.RestartActivityVote) { skip = false; }
531525

532526
if (msg.MouseWheelMoved != lastmsg.MouseWheelMoved) { skip = false; }
533527

534-
if (msg.InputElementPressed != lastmsg.InputElementPressed) { skip = false; }
535-
if (msg.InputElementReleased != lastmsg.InputElementReleased) { skip = false; }
536-
if (msg.InputElementHeld != lastmsg.InputElementHeld) { skip = false; }
528+
if (msg.InputElementState != lastmsg.InputElementState) { skip = false; }
537529
} else {
538530
skip = false;
539531
}
540532

541-
if (!skip) { m_InputMessages[player].push(msg); }
533+
if (!skip) { m_InputMessages[player].push_back(msg); }
542534
}
543535
}
544536

@@ -551,19 +543,13 @@ namespace RTE {
551543
input.m_Y = msg.MouseY;
552544
g_UInputMan.SetNetworkMouseMovement(player, input);
553545

554-
g_UInputMan.SetNetworkMouseButtonHeldState(player, MOUSE_LEFT, msg.MouseButtonHeld[MOUSE_LEFT]);
555-
g_UInputMan.SetNetworkMouseButtonPressedState(player, MOUSE_LEFT, msg.MouseButtonPressed[MOUSE_LEFT]);
556-
g_UInputMan.SetNetworkMouseButtonReleasedState(player, MOUSE_LEFT, msg.MouseButtonReleased[MOUSE_LEFT]);
546+
g_UInputMan.SetNetworkMouseButtonHeldState(player, MOUSE_LEFT, msg.MouseButtonState[MOUSE_LEFT]);
557547

558-
m_MouseState1[player] = (msg.MouseButtonPressed[MOUSE_LEFT] || msg.MouseButtonHeld[MOUSE_LEFT]) ? 1 : 0;
548+
m_MouseState1[player] = (msg.MouseButtonState[MOUSE_LEFT]) ? 1 : 0;
559549

560-
g_UInputMan.SetNetworkMouseButtonHeldState(player, MOUSE_RIGHT, msg.MouseButtonHeld[MOUSE_RIGHT]);
561-
g_UInputMan.SetNetworkMouseButtonPressedState(player, MOUSE_RIGHT, msg.MouseButtonPressed[MOUSE_RIGHT]);
562-
g_UInputMan.SetNetworkMouseButtonReleasedState(player, MOUSE_RIGHT, msg.MouseButtonReleased[MOUSE_RIGHT]);
550+
g_UInputMan.SetNetworkMouseButtonHeldState(player, MOUSE_RIGHT, msg.MouseButtonState[MOUSE_RIGHT]);
563551

564-
g_UInputMan.SetNetworkMouseButtonHeldState(player, MOUSE_MIDDLE, msg.MouseButtonHeld[MOUSE_MIDDLE]);
565-
g_UInputMan.SetNetworkMouseButtonPressedState(player, MOUSE_MIDDLE, msg.MouseButtonPressed[MOUSE_MIDDLE]);
566-
g_UInputMan.SetNetworkMouseButtonReleasedState(player, MOUSE_MIDDLE, msg.MouseButtonReleased[MOUSE_MIDDLE]);
552+
g_UInputMan.SetNetworkMouseButtonHeldState(player, MOUSE_MIDDLE, msg.MouseButtonState[MOUSE_MIDDLE]);
567553

568554
GUIInput::SetNetworkMouseButton(player, m_MouseState1[player], m_MouseState2[player], m_MouseState3[player]);
569555

@@ -573,11 +559,9 @@ namespace RTE {
573559

574560
// Store element states as bit flags
575561
for (int i = 0; i < INPUT_COUNT; i++) {
576-
bool val = (msg.InputElementHeld & bitMask) > 0;
562+
bool val = (msg.InputElementState & bitMask) > 0;
577563

578-
g_UInputMan.SetNetworkInputElementHeldState(player, i, val);
579-
g_UInputMan.SetNetworkInputElementPressedState(player, i, (msg.InputElementPressed & bitMask) > 0);
580-
g_UInputMan.SetNetworkInputElementReleasedState(player, i, (msg.InputElementReleased & bitMask) > 0);
564+
g_UInputMan.SetNetworkInputElementState(player, i, val);
581565

582566
bitMask <<= 1;
583567
}
@@ -596,9 +580,7 @@ namespace RTE {
596580

597581
void NetworkServer::ClearInputMessages(short player) {
598582
if (player >= 0 && player < c_MaxClients) {
599-
while (!m_InputMessages[player].empty()) {
600-
m_InputMessages[player].pop();
601-
}
583+
m_InputMessages[player].clear();
602584
}
603585
}
604586

@@ -1739,7 +1721,10 @@ namespace RTE {
17391721
double compressionRatio = (m_DataUncompressedTotal[i] > 0) ? static_cast<double>(m_DataSentTotal[i]) / static_cast<double>(m_DataUncompressedTotal[i]) : 0;
17401722
double emptyRatio = (m_EmptyBlocks[i] > 0) ? static_cast<double>(m_FullBlocks[i]) / static_cast<double>(m_EmptyBlocks[i]) : 0;
17411723

1742-
std::string playerName = IsPlayerConnected(i) ? GetPlayerName(i) : "- NO PLAYER -";
1724+
std::string playerName = " - NO PLAYER - ";
1725+
if (IsPlayerConnected(i)) {
1726+
playerName = GetPlayerName(i);
1727+
}
17431728

17441729
// Jesus christ
17451730
std::snprintf(buf, sizeof(buf),
@@ -1749,18 +1734,18 @@ namespace RTE {
17491734
"R : % .2f\n"
17501735
"Full Blck %lu (%.1f Kb)\n"
17511736
"Empty Blck %lu (%.1f Kb)\n"
1752-
"Frame Kb : % lu\n"
1753-
"Glow Kb : % lu\n"
1754-
"Sound Kb : % lu\n"
1755-
"Scene Kb : % lu\n"
1756-
"Frames sent : % uK\n"
1757-
"Frame skipped : % uK\n"
1758-
"Blocks full : % uK\n"
1759-
"Blocks empty : % uK\n"
1737+
"Frame Kb : %lu\n"
1738+
"Glow Kb : %lu\n"
1739+
"Sound Kb : %lu\n"
1740+
"Scene Kb : %lu\n"
1741+
"Frames sent : %uK\n"
1742+
"Frame skipped : %uK\n"
1743+
"Blocks full : %uK\n"
1744+
"Blocks empty : %uK\n"
17601745
"Blk Ratio : % .2f\n"
17611746
"Frames ms : % d\n"
17621747
"Send ms % d\n"
1763-
"Total Data % lu MB",
1748+
"Total Data %lu MB",
17641749

17651750
(i == c_MaxClients) ? "- TOTALS - " : playerName.c_str(),
17661751
(i < c_MaxClients) ? m_Ping[i] : 0,
@@ -1825,9 +1810,10 @@ namespace RTE {
18251810
if (processInput) {
18261811
for (short player = 0; player < c_MaxClients; player++) {
18271812
if (!m_InputMessages[player].empty()) {
1828-
MsgInput msg = m_InputMessages[player].front();
1829-
m_InputMessages[player].pop();
1830-
ProcessInputMsg(player, msg);
1813+
for (const MsgInput &msg: m_InputMessages[player]) {
1814+
ProcessInputMsg(player, msg);
1815+
}
1816+
m_InputMessages[player].clear();
18311817
}
18321818
}
18331819

Managers/NetworkServer.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ namespace RTE {
219219

220220
std::string m_ServerPort; //!<
221221

222-
ClientConnection m_ClientConnections[c_MaxClients]; //!<
222+
std::array<ClientConnection, c_MaxClients> m_ClientConnections; //!<
223223

224224
bool m_UseNATService; //!< Whether a NAT service is used for punch-through.
225225
RakNet::NatPunchthroughClient m_NATPunchthroughClient; //!<
@@ -276,12 +276,12 @@ namespace RTE {
276276

277277
std::mutex m_Mutex[c_MaxClients]; //!<
278278

279-
std::queue<MsgInput> m_InputMessages[c_MaxClients]; //!<
279+
std::vector<MsgInput> m_InputMessages[c_MaxClients]; //!< Message Queue for received input events to be processed this frame.
280280

281281
unsigned char m_SceneID; //!<
282282

283-
bool m_EndActivityVotes[c_MaxClients]; //!< Votes from each player required to return to the Multiplayer Lobby.
284-
bool m_RestartActivityVotes[c_MaxClients]; //!< Votes from each player required to restart the current activity.
283+
std::array<bool, c_MaxClients> m_EndActivityVotes; //!< Votes from each player required to return to the Multiplayer Lobby.
284+
std::array<bool, c_MaxClients> m_RestartActivityVotes; //!< Votes from each player required to restart the current activity.
285285

286286
long long m_LatestRestartTime; //!< The time, in ticks, that the last activity restart took place on the server.
287287

Managers/TimerMan.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ namespace RTE {
4646
/// This also clears the accumulator, to avoid the case where the sim may update while paused when behind schedule.
4747
/// </summary>
4848
/// <param name="pause">Whether the sim should be paused or not.</param>
49-
void PauseSim(bool pause = false) { m_SimPaused = pause; m_SimAccumulator = 0.0F; }
49+
void PauseSim(bool pause = false) { m_SimPaused = pause; if(pause) m_SimAccumulator = 0.0F; }
5050

5151
/// <summary>
5252
/// Tells whether there is enough sim time accumulated to do at least one physics update.

0 commit comments

Comments
 (0)