Files
AndroidAisMap/NEW_ARCHITECTURE.md
T
Grigo b5aee265bc feat: новая архитектура UI и расширенная визуализация AIS
Архитектурные улучшения:
- Внедрен UIRenderingCoordinator с централизованным throttling
- Решены проблемы зависания UI через батчинг операций карты
- Добавлен VesselPathController для отслеживания маршрутов
- Реализован MapLibreMapImpl как альтернатива Яндекс.Картам

Визуализация AIS:
- Добавлены векторные иконки для всех типов судов
- Разделение Class A/B судов с соответствующими иконками
- Иконки навигационных статусов (anchor, moored, engine, sail)
- Улучшенный CursorOverlay с информацией о судах

Производительность:
- Throttling UI обновлений (vessel: 500ms, AIS: 1s, paths: 2s)
- Устранение утечек Handler объектов
- Оптимизация GeoJSON операций в MapLibre
2025-10-02 09:15:33 +03:00

78 lines
3.5 KiB
Markdown

# Новая архитектура приложения
## Проблемы текущей архитектуры:
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<String> pendingVesselUpdates;
private Map<String, AISVessel> 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 операций, максимум батчинга