diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f922a3a..c99b7e3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,7 +13,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: actions/setup-go@v5 with: go-version-file: "go.mod" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ce4aa14..557f6ca 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,7 +21,7 @@ jobs: group: ${{ github.workflow }}-${{ github.ref }} runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up QEMU uses: docker/setup-qemu-action@v3 diff --git a/internal/gameServer/server.go b/internal/gameServer/server.go index def17dc..a8b7ae2 100644 --- a/internal/gameServer/server.go +++ b/internal/gameServer/server.go @@ -119,14 +119,16 @@ func (g *GameServer) ManageBuffer() { g.GameDataMutex.Lock() // BufferHealth can be modified by processUDP in a different thread for i := range 4 { if g.GameData.CountLag[i] == 0 { - playerBufferHealth, err := g.bufferHealthAverage(i) + var err error + g.GameData.BufferHealthAverage[i], err = g.bufferHealthAverage(i) if err == nil { activePlayers = true } - if playerBufferHealth > bufferHealth { - bufferHealth = playerBufferHealth + if g.GameData.BufferHealthAverage[i] > bufferHealth { + bufferHealth = g.GameData.BufferHealthAverage[i] } } + g.GameData.BufferHealth[i].Purge() } g.GameDataMutex.Unlock() @@ -155,8 +157,7 @@ func (g *GameServer) ManagePlayers() { _, ok := g.Registrations[i] if ok { if g.GameData.PlayerAlive[i] { - playerBufferHealth, _ := g.bufferHealthAverage(int(i)) - g.Logger.Info("player status", "player", i, "regID", g.Registrations[i].RegID, "bufferSize", g.GameData.BufferSize, "bufferHealth", playerBufferHealth, "countLag", g.GameData.CountLag[i], "address", g.GameData.PlayerAddresses[i]) + g.Logger.Info("player status", "player", i, "regID", g.Registrations[i].RegID, "bufferHealthAverage", g.GameData.BufferHealthAverage[i], "bufferSize", g.GameData.BufferSize, "countLag", g.GameData.CountLag[i], "address", g.GameData.PlayerAddresses[i]) playersActive = true } else { g.Logger.Info("player disconnected UDP", "player", i, "regID", g.Registrations[i].RegID, "address", g.GameData.PlayerAddresses[i]) diff --git a/internal/gameServer/udp.go b/internal/gameServer/udp.go index efa2eac..651dc68 100644 --- a/internal/gameServer/udp.go +++ b/internal/gameServer/udp.go @@ -19,18 +19,19 @@ type InputData struct { } type GameData struct { - SyncValues *lru.Cache[uint32, []byte] - PlayerAddresses []*net.UDPAddr - BufferSize uint32 - BufferHealth []*lru.Cache[uint32, byte] - Inputs []*lru.Cache[uint32, InputData] - PendingInput []InputData - CountLag []uint32 - sendBuffer []byte - recvBuffer []byte - PlayerAlive []bool - LeadCount uint32 - Status byte + SyncValues *lru.Cache[uint32, []byte] + PlayerAddresses [4]*net.UDPAddr + BufferSize uint32 + BufferHealth [4]*lru.Cache[uint32, byte] + BufferHealthAverage [4]float32 + Inputs [4]*lru.Cache[uint32, InputData] + PendingInput [4]InputData + CountLag [4]uint32 + sendBuffer []byte + recvBuffer []byte + PlayerAlive [4]bool + LeadCount uint32 + Status byte } const ( @@ -46,7 +47,6 @@ const ( DisconnectTimeoutS = 30 NoRegID = 255 InputDataMax int = 60 * 60 // One minute of input data - BufferHealthMax = 10 CS4 = 32 ) @@ -210,18 +210,12 @@ func (g *GameServer) createUDPServer() error { } g.Logger.Info("Created UDP server", "port", g.Port) - g.GameData.PlayerAddresses = make([]*net.UDPAddr, 4) g.GameData.BufferSize = 3 - g.GameData.Inputs = make([]*lru.Cache[uint32, InputData], 4) - g.GameData.BufferHealth = make([]*lru.Cache[uint32, byte], 4) for i := range 4 { g.GameData.Inputs[i], _ = lru.New[uint32, InputData](InputDataMax) - g.GameData.BufferHealth[i], _ = lru.New[uint32, byte](BufferHealthMax) + g.GameData.BufferHealth[i], _ = lru.New[uint32, byte](InputDataMax) } - g.GameData.PendingInput = make([]InputData, 4) g.GameData.SyncValues, _ = lru.New[uint32, []byte](100) // Store up to 100 sync values - g.GameData.PlayerAlive = make([]bool, 4) - g.GameData.CountLag = make([]uint32, 4) g.GameData.sendBuffer = make([]byte, 508) g.GameData.recvBuffer = make([]byte, 1500)