From 937fc88297b8bfcfcb6bbfe0e74821001eeb2b28 Mon Sep 17 00:00:00 2001 From: adastram Date: Sun, 14 Jan 2024 23:51:07 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20du=20controle=20des=20fps=20et=20d'un?= =?UTF-8?q?=20syst=C3=A8me=20de=20contrebalance=20de=20latence?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/engine/engine.py | 58 ++++++++++++++++++++++++++++++---- src/engine/settings_manager.py | 5 +++ 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/src/engine/engine.py b/src/engine/engine.py index b17d9f3..d685207 100644 --- a/src/engine/engine.py +++ b/src/engine/engine.py @@ -44,22 +44,66 @@ class Engine: self.settings_manager.get_sound_global_master_volume(), self.settings_manager.get_sound_master_volume()) + self.global_latency = 0 + self.last_latency = [] + self.latency_precision = self.settings_manager.latency_precision def loop(self): """Fonction à lancer au début du programme et qui va lancer les updates dans une boucle. Attend jusqu'à la fin du jeu.""" self.running = True - delta = 1. # Le delta est le temps depuis la dernière image - last_time = time.time_ns()/10E8 - while self.running: - self.update(delta) + self.start_time = time.time() + self.frames = 0 - new_time = time.time_ns()/10E8 - delta = new_time-last_time - last_time = new_time + # Initialisation ddes valeurs de delta et de last_time + delta = 1. # Le delta est le temps depuis la dernière image + last_time = time.time() + + latency = 0 + + + + + while self.running: + refresh_rate = self.settings_manager.get_refresh_rate() + if refresh_rate == -1: # Pas de limite, vers l'infini et l'au-delà !!! + + self.update(delta) + new_time = time.time() + delta = new_time - last_time + last_time = new_time + + else: + while time.time() < last_time + 1 / refresh_rate - self.global_latency: + pass + + new_time = time.time() + delta = new_time-last_time + last_time = new_time + + + self.update(delta) + + latency = delta - 1/refresh_rate + if not latency > self.global_latency * 100 or self.global_latency == 0 or self.settings_manager.get_refresh_rate() != refresh_rate: # Impossible que le jeu prenne autant de retard, on skip cette latence dans le calcul, l'utilisateur a surement cliquer hors de la fenêtre + if len(self.last_latency) < self.latency_precision: + self.last_latency.append(latency) + else: + self.last_latency.pop(0) + self.last_latency.append(latency) + + n = 0 + for i in self.last_latency: + n += i + + self.global_latency = n/len(self.last_latency) def update(self, delta: float): + self.frames += 1 + if time.time() > 50 + self.start_time: + print(self.frames/50) + exit() """Fonction qui regroupe toutes les updates des composants. Elle permet de mettre à jour le jeu quand on l'appelle.""" self.camera.update(delta, self.settings_manager.get_zoom()) diff --git a/src/engine/settings_manager.py b/src/engine/settings_manager.py index 886c345..78643e6 100644 --- a/src/engine/settings_manager.py +++ b/src/engine/settings_manager.py @@ -1,5 +1,7 @@ class SettingsManager: def __init__(self, default_master_volume: float, default_zoom: float) -> None: + self.refresh_rate = 200 + self.latency_precision = 100 # Nombre de valeurs de latence stocké (Pour faire la moyenne) self.master_volume = default_master_volume self.sound_master_volume = 100 self.music_master_volume = 100 @@ -7,6 +9,9 @@ class SettingsManager: self.zoom = default_zoom + def get_refresh_rate(self): + return self.refresh_rate + def get_zoom(self): return self.zoom