diff --git a/cmd/client/game_render.go b/cmd/client/game_render.go index 846a3c0..da36029 100644 --- a/cmd/client/game_render.go +++ b/cmd/client/game_render.go @@ -74,6 +74,8 @@ func (g *Game) UpdateGame() { g.btnDownActive = false // --- 4. INPUT SENDEN (MIT CLIENT PREDICTION) --- + // Prediction läuft bei jedem Frame (60 TPS) für flüssige Darstellung. + // Netz-Send wird auf ~20/sek gedrosselt um Server-Last zu begrenzen. if g.connected { g.predictionMutex.Lock() // Sequenznummer erhöhen @@ -86,10 +88,23 @@ func (g *Game) UpdateGame() { // Input für History speichern (für Server-Reconciliation) g.pendingInputs[input.Sequence] = input + // Cap: nie mehr als 120 unbestätigte Inputs ansammeln + if len(g.pendingInputs) > 120 { + oldest := g.inputSequence - 120 + for seq := range g.pendingInputs { + if seq < oldest { + delete(g.pendingInputs, seq) + } + } + } + g.predictionMutex.Unlock() - // Input an Server senden - g.SendInputWithSequence(input) + // Netz-Throttle: max 20 Inputs/Sek senden + if time.Since(g.lastInputTime) >= 50*time.Millisecond { + g.lastInputTime = time.Now() + g.SendInputWithSequence(input) + } } // --- 5. KAMERA LOGIK --- diff --git a/cmd/client/main_native.go b/cmd/client/main_native.go index f16b290..8c8a079 100644 --- a/cmd/client/main_native.go +++ b/cmd/client/main_native.go @@ -12,7 +12,7 @@ import ( func main() { ebiten.SetWindowSize(ScreenWidth, ScreenHeight) ebiten.SetWindowTitle("Escape From Teacher") - ebiten.SetTPS(20) + ebiten.SetTPS(60) ebiten.SetVsyncEnabled(true) if err := ebiten.RunGame(NewGame()); err != nil { log.Fatal(err) diff --git a/cmd/client/main_wasm.go b/cmd/client/main_wasm.go index 643e83e..84770a4 100644 --- a/cmd/client/main_wasm.go +++ b/cmd/client/main_wasm.go @@ -27,7 +27,7 @@ func main() { // WICHTIG: Keine feste WindowSize auf WASM - Layout() regelt die Größe dynamisch ebiten.SetWindowTitle("Escape From Teacher") - ebiten.SetTPS(20) + ebiten.SetTPS(60) ebiten.SetVsyncEnabled(true) if err := ebiten.RunGame(game); err != nil {