# Новая архитектура приложения ## Проблемы текущей архитектуры: 1. **AppController смешивает логику и UI**: - `mapInterface.updateOwnVesselPosition()` вызывается напрямую - `uiHandler.post(() -> mapInterface.addAISVesselMarker())` - Контроллеры знают о UI деталях 2. **Нет единого поток UI операций**: - Каждый контроллер делает свои UI вызовы - Нет централизованного throttling для карты - Перегрузка UI потока ## Новая архитектура: ### 1. **Контроллеры (Background Threads)**: - Только **обновляют модель данных** (ownVessel, aisVessels) - Только **вычисления** (paths, predictions, compass) - Только **парсинг данных** (NMEA, GPS, UDP) - **Не знают** о UI карте ### 2. **UI Coordinator (Main Thread)**: - **Единая точка** всех UI операций - **Централизованный throttling** (500мс, 1сек) - **Батчинг** операций карты - **Координация** между контроллерами и UI ### 3. **Data Flow**: ``` Background Threads → Model Updates → UI Coordinator → Throttled Map Updates ↓ ↓ ↓ ↓ NMEA/GPS ownVessel Batched UI MapLibre Parsing AIS Data Operations Rendering ``` ## План реализации: ### Этап 1: Создать UI Coordinator ```java public class UIRenderingCoordinator { private MapInterface mapInterface; private Handler uiHandler; private Runnable batchedUpdateRunnable; private Set pendingVesselUpdates; private Map pendingAISUpdates; void requestVesselUpdate(Vessel vessel) { /* add to pending */ } void requestAISUpdate(AISVessel vessel) { /* add to pending */ } void executeBatchUpdate() { /* throttled map rendering */ } } ``` ### Этап 2: Рефакторить AppController - Убрать все `mapInterface.*` вызовы - Только обновлять `ownVessel` данные - Уведомлять `UIRenderingCoordinator` через интерфейс - Никаких `uiHandler.post()` в контроллерах ### Этап 3: Установить throttling - Все UI операции → UI Coordinator - Throttling 500мс для критичных операций - Throttling 1сек для некритичных (paths, compass) ### Этап 4: Батчинг операций - Собирать все изменения за период throttling - Одним вызовом обновить всю карту - Минимизировать количество `mapInterface` вызовов ## Ожидаемый результат: ✅ **Стабильная производительность** - контроллеры работают в фоне ✅ **Предсказуемые зависания** - все UI операции через единую точку ✅ **Масштабируемость** - легко добавить новые контроллеры ✅ **Тестируемость** - контроллеры не зависят от UI ✅ **Производительность** - минимум UI операций, максимум батчинга