11package gameserver
22
33import (
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+
95109func (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
0 commit comments