From 178dfb0c2ae48990f4b8a098ff023897ae9b3c8f Mon Sep 17 00:00:00 2001 From: 5ymb01 <5ymb01ixm@gmail.com> Date: Fri, 20 Mar 2026 09:59:58 -0400 Subject: [PATCH] fix(perf): cache fonts in sport base classes to avoid disk I/O per frame (#285) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(perf): cache fonts in sport base classes to avoid disk I/O per frame Replace 7 ImageFont.truetype() calls in display methods with cached self.fonts['detail'] lookups. The 4x6-font.ttf at size 6 is already loaded once in _load_fonts() — loading it again on every display() call causes unnecessary disk I/O on each render frame (~30-50 FPS). Files: sports.py (2), football.py (1), hockey.py (2), basketball.py (1), baseball.py (1) Co-Authored-By: 5ymb01 Co-Authored-By: Claude Opus 4.6 * chore: trigger CodeRabbit review --------- Co-authored-by: 5ymb01 <5ymb01@users.noreply.github.com> Co-authored-by: 5ymb01 Co-authored-by: Claude Opus 4.6 --- src/base_classes/baseball.py | 2 +- src/base_classes/basketball.py | 9 +-------- src/base_classes/football.py | 9 ++------- src/base_classes/hockey.py | 11 ++--------- src/base_classes/sports.py | 18 ++++-------------- 5 files changed, 10 insertions(+), 39 deletions(-) diff --git a/src/base_classes/baseball.py b/src/base_classes/baseball.py index 9dd6a7b5..6bfeb5aa 100644 --- a/src/base_classes/baseball.py +++ b/src/base_classes/baseball.py @@ -329,7 +329,7 @@ class Baseball(SportsCore): return series_summary = game.get("series_summary", "") - font = ImageFont.truetype("assets/fonts/4x6-font.ttf", 6) + font = self.fonts.get('detail', ImageFont.load_default()) bbox = draw_overlay.textbbox((0, 0), series_summary, font=self.fonts['time']) height = bbox[3] - bbox[1] shots_y = (self.display_height - height) // 2 diff --git a/src/base_classes/basketball.py b/src/base_classes/basketball.py index e4647703..e00782e1 100644 --- a/src/base_classes/basketball.py +++ b/src/base_classes/basketball.py @@ -201,14 +201,7 @@ class BasketballLive(Basketball, SportsLive): # Draw records or rankings if enabled if self.show_records or self.show_ranking: - try: - record_font = ImageFont.truetype("assets/fonts/4x6-font.ttf", 6) - self.logger.debug(f"Loaded 6px record font successfully") - except IOError: - record_font = ImageFont.load_default() - self.logger.warning( - f"Failed to load 6px font, using default font (size: {record_font.size})" - ) + record_font = self.fonts.get('detail', ImageFont.load_default()) # Get team abbreviations away_abbr = game.get("away_abbr", "") diff --git a/src/base_classes/football.py b/src/base_classes/football.py index a905bb02..24d0873b 100644 --- a/src/base_classes/football.py +++ b/src/base_classes/football.py @@ -308,13 +308,8 @@ class FootballLive(Football, SportsLive): # Draw records or rankings if enabled if self.show_records or self.show_ranking: - try: - record_font = ImageFont.truetype("assets/fonts/4x6-font.ttf", 6) - self.logger.debug(f"Loaded 6px record font successfully") - except IOError: - record_font = ImageFont.load_default() - self.logger.warning(f"Failed to load 6px font, using default font (size: {record_font.size})") - + record_font = self.fonts.get('detail', ImageFont.load_default()) + # Get team abbreviations away_abbr = game.get('away_abbr', '') home_abbr = game.get('home_abbr', '') diff --git a/src/base_classes/hockey.py b/src/base_classes/hockey.py index c98f896d..c54b5fa8 100644 --- a/src/base_classes/hockey.py +++ b/src/base_classes/hockey.py @@ -255,7 +255,7 @@ class HockeyLive(Hockey, SportsLive): # Shots on Goal if self.show_shots_on_goal: - shots_font = ImageFont.truetype("assets/fonts/4x6-font.ttf", 6) + shots_font = self.fonts.get('detail', ImageFont.load_default()) home_shots = str(game.get("home_shots", "0")) away_shots = str(game.get("away_shots", "0")) shots_text = f"{away_shots} SHOTS {home_shots}" @@ -276,14 +276,7 @@ class HockeyLive(Hockey, SportsLive): # Draw records or rankings if enabled if self.show_records or self.show_ranking: - try: - record_font = ImageFont.truetype("assets/fonts/4x6-font.ttf", 6) - self.logger.debug(f"Loaded 6px record font successfully") - except IOError: - record_font = ImageFont.load_default() - self.logger.warning( - f"Failed to load 6px font, using default font (size: {record_font.size})" - ) + record_font = self.fonts.get('detail', ImageFont.load_default()) # Get team abbreviations away_abbr = game.get("away_abbr", "") diff --git a/src/base_classes/sports.py b/src/base_classes/sports.py index b4e73b50..74e11fb7 100644 --- a/src/base_classes/sports.py +++ b/src/base_classes/sports.py @@ -863,13 +863,8 @@ class SportsUpcoming(SportsCore): # Draw records or rankings if enabled if self.show_records or self.show_ranking: - try: - record_font = ImageFont.truetype("assets/fonts/4x6-font.ttf", 6) - self.logger.debug(f"Loaded 6px record font successfully") - except IOError: - record_font = ImageFont.load_default() - self.logger.warning(f"Failed to load 6px font, using default font (size: {record_font.size})") - + record_font = self.fonts.get('detail', ImageFont.load_default()) + # Get team abbreviations away_abbr = game.get('away_abbr', '') home_abbr = game.get('home_abbr', '') @@ -1172,13 +1167,8 @@ class SportsRecent(SportsCore): # Draw records or rankings if enabled if self.show_records or self.show_ranking: - try: - record_font = ImageFont.truetype("assets/fonts/4x6-font.ttf", 6) - self.logger.debug(f"Loaded 6px record font successfully") - except IOError: - record_font = ImageFont.load_default() - self.logger.warning(f"Failed to load 6px font, using default font (size: {record_font.size})") - + record_font = self.fonts.get('detail', ImageFont.load_default()) + # Get team abbreviations away_abbr = game.get('away_abbr', '') home_abbr = game.get('home_abbr', '')