-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfps_counter.py
More file actions
69 lines (60 loc) · 3.16 KB
/
fps_counter.py
File metadata and controls
69 lines (60 loc) · 3.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import pygame
from collections import deque
import time
class FPSCounter:
def __init__(self, maxlen=60, font=None, color=(255,255,255), pos=(0,0), update_interval=0.5):
self.samples = deque(maxlen=maxlen)
self.font = font or pygame.font.Font(None, 36)
self.color = color
self.pos = pos # Offset from bottom left: (x from left, y from bottom)
self.maxlen = maxlen
self.last_update = time.time()
self.update_interval = update_interval
self._needs_redraw = True
self._displayed_text: str = "" # Der String, der aktuell gerendert wird
self._current_fps: float = 0.0
self._window_min_fps: float = 0.0 # Min-FPS im aktuellen Fenster
self._window_max_fps: float = 0.0 # Max-FPS im aktuellen Fenster
self._needs_redraw: bool = True
self._rendered_surf: pygame.Surface = pygame.Surface((0, 0)) # avoid NoneType errors
def update(self, current_frame_fps: float):
"""
Aktualisiert die FPS-Historie mit dem neuesten Wert
und berechnet die angezeigten Min/Max/Avg-Werte, wenn das Intervall erreicht ist.
"""
if current_frame_fps > 0: # Vermeide das Hinzufügen von 0-Werten, die den Durchschnitt verfälschen
self.samples.append(current_frame_fps)
self._current_fps = current_frame_fps # Speichere den aktuellen FPS-Wert
now = time.time()
# Prüfe, ob es Zeit ist, den angezeigten Text zu aktualisieren
if now - self.last_update >= self.update_interval:
self.last_update = now
if not self.samples: # Wenn keine Samples vorhanden sind (z.B. ganz am Anfang)
new_text = "FPS: 0.0 | Max: 0.0 | Min: 0.0"
self._window_min_fps = 0.0
self._window_max_fps = 0.0
else:
# Berechne Min/Max/Avg im aktuellen Fenster
self._window_min_fps = min(self.samples)
self._window_max_fps = max(self.samples)
avg_fps = sum(self.samples) / len(self.samples)
# Formatiere den neuen Text
new_text = f"FPS: {avg_fps:5.1f} | Max: {self._window_max_fps:5.1f} | Min: {self._window_min_fps:5.1f}"
# Prüfe, ob sich der Text geändert hat, um unnötiges Neuzeichnen zu vermeiden
if new_text != self._displayed_text:
self._displayed_text = new_text
self._needs_redraw = True # Setze Flag, dass Text-Surface neu erstellt werden muss
def draw(self, screen: pygame.Surface):
"""
Draws the FPS counter on the given screen surface.
"""
if self._needs_redraw and self._displayed_text:
self._rendered_surf = self.font.render(self._displayed_text, True, self.color)
self._needs_redraw = False
if self._rendered_surf:
x_offset, y_offset = self.pos
surf_rect = self._rendered_surf.get_rect()
screen_rect = screen.get_rect()
# Always stick to bottom-left: x from left, y from bottom
draw_pos = (x_offset, screen_rect.height - surf_rect.height - y_offset)
screen.blit(self._rendered_surf, draw_pos)