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

3.5 KiB
Raw Blame History

Новая архитектура приложения

Проблемы текущей архитектуры:

  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

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 операций, максимум батчинга