Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .jules/bolt.md
Original file line number Diff line number Diff line change
Expand Up @@ -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` и по возможности использовать сравнение квадратов для проверки расстояний.
23 changes: 15 additions & 8 deletions src/core/input_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")

Expand All @@ -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")