Skip to main content
Removing tags from title
Link
DMGregory
  • 136.3k
  • 22
  • 247
  • 373

C# MonoGame - developing simple multiplayer Server game loop

added tags
Link
Logan
  • 35
  • 1
  • 4
Source Link
Logan
  • 35
  • 1
  • 4

C# MonoGame - developing simple multiplayer

I'm trying to setup a very simple multiplayer game that allows some users to join and walk around. The game is 2D and the players will have a position, the direction they are looking in (it's a top-down game) and their animation frame index (so they can be animated for all clients). This is my game loop that I have at the moment:

private void run()
{
    long lastTick = 0;
    long tickDelay = 33;
    int tps = 0;
    int ticks = 0;
    long lastTickCount = 0;

    List<Connection> toRemove = new List<Connection>();

    while (!shouldStop)
    {
        lock (connections)
        {
            if (connections.Count != 0)
            {
                foreach (Connection connection in connections)
                {
                    if (!connection.IsInitialized)
                    {
                        if (connection.Initialize())
                        {
                            BroadcastChatMessage(connection.Username + " has joined");
                        }
                        else
                        {
                            Console.WriteLine("Disconnected " + connection.IP + ": failed to authenticate");
                            connection.Close();
                            toRemove.Add(connection);
                        }
                    }
                    else
                    {
                        int cmd = connection.ReceiveCommand();

                        if (cmd == -1)
                        {
                            BroadcastChatMessage(connection.Username + " has left");
                            connection.Close();
                            toRemove.Add(connection);
                        }
                    }
                }
            }

            if (toRemove.Count != 0)
            {
                foreach (Connection connection in toRemove)
                {
                    connections.Remove(connection);
                }

                toRemove.Clear();
            }
        }

        ticks++;
        long now = CurrentTimeMillis;

        if (now - lastTickCount >= 1000)
        {
            lastTickCount = now;
            tps = ticks;
            ticks = 0;
        }

        int connectionsCount = 0;

        lock (connections)
        {
            connectionsCount = connections.Count;
        }

        Console.Title = "Top-Down Multiplayer Server [TPS: " + tps + ", Connected: " + connectionsCount + "]";

        lastTick = CurrentTimeMillis;
        Thread.Sleep(20);

        while (CurrentTimeMillis - lastTick <= tickDelay) { }
    }
}

I have a simple mechanism that makes the server run at 30 ticks per second with a Thread.Sleep to free up CPU. Should I be processing data from all the clients in the same thread like this? What should the ticks per second be determined by? Am I on the right track with this loop?

P.S: In the future I would process the game after I handle connections and before I do ticks++ (after I receive client data and before I count the ticks per second).