generated from Grigo/AndroidTemplate
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
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
# Новая архитектура приложения
|
||||
|
||||
## Проблемы текущей архитектуры:
|
||||
|
||||
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 операций, максимум батчинга
|
||||
Reference in New Issue
Block a user