Skip to content

Commit 64a562a

Browse files
committed
new method for calculating buffer size
1 parent c09ba03 commit 64a562a

File tree

7 files changed

+46
-25
lines changed

7 files changed

+46
-25
lines changed

.github/workflows/build.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ jobs:
1717
- uses: actions/setup-go@v5
1818
with:
1919
go-version-file: "go.mod"
20-
cache: false
2120

2221
- name: golangci-lint
2322
uses: golangci/golangci-lint-action@v8

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ require (
88
github.com/hashicorp/go-retryablehttp v0.7.8
99
github.com/hashicorp/golang-lru/v2 v2.0.7
1010
go.uber.org/zap v1.27.0
11-
golang.org/x/net v0.42.0
11+
golang.org/x/net v0.43.0
1212
)
1313

1414
require (
1515
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
16-
golang.org/x/sys v0.34.0 // indirect
16+
golang.org/x/sys v0.35.0 // indirect
1717
)
1818

1919
require (

go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
3030
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
3131
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
3232
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
33-
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
34-
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
35-
golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
36-
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
33+
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
34+
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
35+
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
36+
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
3737
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
3838
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

internal/gameServer/server.go

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gameserver
22

33
import (
4+
"fmt"
45
"net"
56
"strings"
67
"sync"
@@ -49,7 +50,7 @@ type GameServer struct {
4950
Features map[string]string
5051
NeedsUpdatePlayers bool
5152
NumberOfPlayers int
52-
BufferTarget int32
53+
BufferTarget uint32
5354
QuitChannel *chan bool
5455
}
5556

@@ -92,6 +93,19 @@ func (g *GameServer) isConnClosed(err error) bool {
9293
return strings.Contains(err.Error(), "use of closed network connection")
9394
}
9495

96+
func (g *GameServer) bufferHealthAverage(playerNumber int) (float32, error) {
97+
var bufferHealth float32
98+
if g.GameData.BufferHealth[playerNumber].Len() > 0 {
99+
for _, k := range g.GameData.BufferHealth[playerNumber].Keys() {
100+
value, _ := g.GameData.BufferHealth[playerNumber].Peek(k)
101+
bufferHealth += float32(value)
102+
}
103+
return bufferHealth / float32(g.GameData.BufferHealth[playerNumber].Len()), nil
104+
} else {
105+
return 0, fmt.Errorf("no buffer health data for player %d", playerNumber)
106+
}
107+
}
108+
95109
func (g *GameServer) ManageBuffer() {
96110
for {
97111
if !g.Running {
@@ -100,27 +114,29 @@ func (g *GameServer) ManageBuffer() {
100114
}
101115

102116
// Find the largest buffer health
103-
var bufferHealth int32 = -1
117+
var bufferHealth float32
118+
var foundPlayer bool
104119
for i := range 4 {
105-
if g.GameData.BufferHealth[i] != -1 && g.GameData.CountLag[i] == 0 {
106-
if g.GameData.BufferHealth[i] > bufferHealth {
107-
bufferHealth = g.GameData.BufferHealth[i]
120+
if g.GameData.CountLag[i] == 0 {
121+
playerBufferHealth, err := g.bufferHealthAverage(i)
122+
if err == nil && playerBufferHealth > bufferHealth {
123+
bufferHealth = playerBufferHealth
124+
foundPlayer = true
108125
}
109126
}
110127
}
111128

112-
// Adjust the buffer size
113-
if bufferHealth != -1 {
114-
if bufferHealth > g.BufferTarget && g.GameData.BufferSize > 0 {
129+
if foundPlayer {
130+
if bufferHealth > float32(g.BufferTarget)+0.5 && g.GameData.BufferSize > 0 {
115131
g.GameData.BufferSize--
116132
g.Logger.Info("reduced buffer size", "bufferHealth", bufferHealth, "bufferSize", g.GameData.BufferSize)
117-
} else if bufferHealth < g.BufferTarget {
133+
} else if bufferHealth < float32(g.BufferTarget)-0.5 {
118134
g.GameData.BufferSize++
119135
g.Logger.Info("increased buffer size", "bufferHealth", bufferHealth, "bufferSize", g.GameData.BufferSize)
120136
}
121137
}
122138

123-
time.Sleep(time.Second * 3)
139+
time.Sleep(time.Second)
124140
}
125141
}
126142

@@ -135,7 +151,8 @@ func (g *GameServer) ManagePlayers() {
135151
_, ok := g.Registrations[i]
136152
if ok {
137153
if g.GameData.PlayerAlive[i] {
138-
g.Logger.Info("player status", "player", i, "regID", g.Registrations[i].RegID, "bufferSize", g.GameData.BufferSize, "bufferHealth", g.GameData.BufferHealth[i], "countLag", g.GameData.CountLag[i], "address", g.GameData.PlayerAddresses[i])
154+
playerBufferHealth, _ := g.bufferHealthAverage(int(i))
155+
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])
139156
playersActive = true
140157
} else {
141158
g.Logger.Info("player disconnected UDP", "player", i, "regID", g.Registrations[i].RegID, "address", g.GameData.PlayerAddresses[i])
@@ -153,7 +170,7 @@ func (g *GameServer) ManagePlayers() {
153170
g.PlayersMutex.Unlock()
154171
}
155172
}
156-
g.GameData.BufferHealth[i] = -1
173+
g.GameData.BufferHealth[i].Purge()
157174
}
158175
}
159176
g.GameData.PlayerAlive[i] = false

internal/gameServer/tcp.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ func (g *GameServer) processTCP(conn *net.TCPConn) {
353353
g.PlayersMutex.Unlock()
354354
}
355355
}
356-
g.GameData.BufferHealth[i] = -1
356+
g.GameData.BufferHealth[i].Purge()
357357
g.GameDataMutex.Unlock()
358358
}
359359
}

internal/gameServer/udp.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ type GameData struct {
2222
SyncValues *lru.Cache[uint32, []byte]
2323
PlayerAddresses []*net.UDPAddr
2424
BufferSize uint32
25-
BufferHealth []int32
25+
BufferHealth []*lru.Cache[uint32, byte]
2626
Inputs []*lru.Cache[uint32, InputData]
2727
PendingInput []InputData
2828
CountLag []uint32
@@ -46,6 +46,7 @@ const (
4646
DisconnectTimeoutS = 30
4747
NoRegID = 255
4848
InputDataMax int = 60 * 60 // One minute of input data
49+
BufferHealthMax = 10
4950
CS4 = 32
5051
)
5152

@@ -149,7 +150,7 @@ func (g *GameServer) processUDP(addr *net.UDPAddr) {
149150
return
150151
}
151152
g.GameData.CountLag[sendingPlayerNumber] = g.sendUDPInput(count, addr, playerNumber, spectator != 0, sendingPlayerNumber)
152-
g.GameData.BufferHealth[sendingPlayerNumber] = int32(g.GameData.recvBuffer[11])
153+
g.GameData.BufferHealth[sendingPlayerNumber].Add(count, g.GameData.recvBuffer[11])
153154

154155
g.GameDataMutex.Lock() // PlayerAlive can be modified by ManagePlayers in a different thread
155156
g.GameData.PlayerAlive[sendingPlayerNumber] = true
@@ -212,10 +213,11 @@ func (g *GameServer) createUDPServer() error {
212213

213214
g.GameData.PlayerAddresses = make([]*net.UDPAddr, 4)
214215
g.GameData.BufferSize = 3
215-
g.GameData.BufferHealth = []int32{-1, -1, -1, -1}
216216
g.GameData.Inputs = make([]*lru.Cache[uint32, InputData], 4)
217+
g.GameData.BufferHealth = make([]*lru.Cache[uint32, byte], 4)
217218
for i := range 4 {
218219
g.GameData.Inputs[i], _ = lru.New[uint32, InputData](InputDataMax)
220+
g.GameData.BufferHealth[i], _ = lru.New[uint32, byte](BufferHealthMax)
219221
}
220222
g.GameData.PendingInput = make([]InputData, 4)
221223
g.GameData.SyncValues, _ = lru.New[uint32, []byte](100) // Store up to 100 sync values

internal/lobbyServer/lobby.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"crypto/sha256"
55
"encoding/hex"
66
"encoding/json"
7+
"errors"
78
"fmt"
89
"math"
910
"net"
@@ -84,7 +85,7 @@ type RoomData struct {
8485
RoomName string `json:"room_name"`
8586
MD5 string `json:"MD5"`
8687
Port int `json:"port"`
87-
BufferTarget int32 `json:"buffer_target,omitempty"`
88+
BufferTarget uint32 `json:"buffer_target,omitempty"`
8889
}
8990

9091
type SocketMessage struct {
@@ -110,7 +111,9 @@ func (s *LobbyServer) sendData(ws *websocket.Conn, message SocketMessage) error
110111
err := ws.WriteJSON(message)
111112
s.SendMutex.Unlock()
112113
if err != nil {
113-
return fmt.Errorf("error sending data: %s", err.Error())
114+
if !errors.Is(err, websocket.ErrCloseSent) {
115+
return err
116+
}
114117
}
115118
return nil
116119
}

0 commit comments

Comments
 (0)