From d60074131320850fd5210655adcee0547d822fac Mon Sep 17 00:00:00 2001 From: mx57 <38256814+mx57@users.noreply.github.com> Date: Sat, 27 Jun 2026 16:48:56 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=20Bolt:=20Optimize=20mouse=20speed=20?= =?UTF-8?q?and=20distance=20calculations=20in=20InputManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Optimized the `handle_mouse` method in `InputManager` by replacing slow exponentiation (**2) and square root (**0.5) operations with direct multiplication and squared distance comparisons. This is a classic optimization for high-frequency events like mouse movements. --- .jules/bolt.md | 4 ++++ src/core/input_manager.py | 23 +++++++++++++++-------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/.jules/bolt.md b/.jules/bolt.md index fa8778e..2d9881a 100644 --- a/.jules/bolt.md +++ b/.jules/bolt.md @@ -2,3 +2,7 @@ ## 2026-06-25 - [SQLite Optimization in DataStore] **Инсайт:** Открытие и закрытие соединения SQLite на каждую запись (log_event) создавало значительные накладные расходы (overhead), особенно при частом логировании. Использование режима WAL (Write-Ahead Logging) и синхронизации NORMAL в сочетании с постоянным соединением дает колоссальный прирост скорости записи. **Действие:** Всегда использовать пул соединений или одно постоянное соединение для локальных БД SQLite, если приложение предполагает частые мелкие записи. Не забывать про PRAGMA journal_mode=WAL. + +## 2026-06-25 - [Math Optimization in InputManager] +**Инсайт:** Использование `**2` и `**0.5` (или `math.sqrt`) в обработчиках событий мыши, которые срабатывают сотни раз в секунду, создает избыточную нагрузку на CPU. Прямое умножение `x*x` и сравнение квадратов расстояний позволяет избежать вычисления квадратного корня и общих операций возведения в степень. +**Действие:** В "горячих" участках кода (обработчики UI-событий, циклы анимации) заменять `**2` на `x*x` и по возможности использовать сравнение квадратов для проверки расстояний. diff --git a/src/core/input_manager.py b/src/core/input_manager.py index 6b5a353..4103ea6 100644 --- a/src/core/input_manager.py +++ b/src/core/input_manager.py @@ -83,15 +83,19 @@ def handle_mouse(self, x, y): if dt > 0: dx = x - self.last_mouse_pos[0] dy = y - self.last_mouse_pos[1] - speed = (dx**2 + dy**2)**0.5 / dt - - # Если мышь движется быстро, активируем охоту - if speed > 1500: # px/sec + # Оптимизация: используем квадрат расстояния для сравнения скоростей, + # чтобы избежать дорогостоящего вычисления корня (sqrt/**0.5) и возведения в степень (**2) + dist_sq = dx * dx + dy * dy + + # Если мышь движется быстро, активируем охоту (1500 px/sec) + # speed > 1500 => sqrt(dist_sq)/dt > 1500 => dist_sq > (1500 * dt)**2 + threshold_fast = 1500 * dt + if dist_sq > threshold_fast * threshold_fast: if self.window.animation_manager.current_state != "hunting": self.window.animation_manager.play_state("hunting") self.window.start_hunting(x, y) - elif speed < 100: - # Если мышь замерла, выходим из охоты через пару секунд + elif dist_sq < (100 * dt) * (100 * dt): + # Если мышь замерла (speed < 100 px/sec), выходим из охоты через пару секунд if self.window.animation_manager.current_state == "hunting" and (now - self.last_mouse_time) > 2: self.window.animation_manager.play_state("idle") @@ -100,9 +104,12 @@ def handle_mouse(self, x, y): # Проверка "поглаживания" pet_pos = self.window.pos() - dist = ((x - (pet_pos.x() + 50))**2 + (y - (pet_pos.y() + 50))**2)**0.5 + dx_pet = x - (pet_pos.x() + 50) + dy_pet = y - (pet_pos.y() + 50) + dist_sq_pet = dx_pet * dx_pet + dy_pet * dy_pet - if dist < 60: + # Оптимизация: сравнение квадрата расстояния (порог 60px -> 3600) + if dist_sq_pet < 3600: if self.window.animation_manager.current_state not in ["playing", "hunting", "shaking"]: self.window.animation_manager.play_state("playing") self.window.sound_manager.play_sound("purr")