Files
AndroidAisMap/UI_PERFORMANCE_OPTIMIZATIONS.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

4.5 KiB
Raw Blame History

Оптимизации производительности UI для устранения зависаний

Проблемы, которые были исправлены:

1. Избыточные периодические обновления маркеров

Проблема: YandexMarkerManager обновлял все маркеры каждые 2 секунды Решение:

  • Увеличен интервал до 10 секунд
  • Изменена логика: теперь проверяется только валидность маркеров, а не полное пересоздание

2. Частые обновления камеры карты

Проблема: Слушатель камеры срабатывал каждые 50мс Решение:

  • Увеличен throttling до 200мс
  • Увеличена чувствительность изменения зума с 0.5 до 1.0
  • Оптимизирована логика обновления маркеров

3. Множественные Handler'ы в UI потоке

Проблема: Слишком частые обновления UI элементов Решение:

  • MainActivity: интервал обновления сообщений увеличен с 1 до 2 секунд
  • BottomSheet: интервал обновления увеличен с 1 до 3 секунд
  • AisTargetsActivity: интервал обновления увеличен с 1 до 2 секунд

4. Частые операции с layout

Проблема: updateControlPanelPosition() вызывался слишком часто Решение:

  • Добавлен throttling с задержкой 50мс
  • Добавлена обработка исключений

5. Операции с картой без throttling

Проблема: Обновления позиции судна на карте без задержки Решение:

  • Добавлен throttling с задержкой 100мс для обновлений карты

Дополнительные рекомендации:

1. Мониторинг производительности

Добавьте логирование времени выполнения операций:

long startTime = System.currentTimeMillis();
// операция
long duration = System.currentTimeMillis() - startTime;
if (duration > 16) { // больше одного кадра (60 FPS)
    Log.w(TAG, "Медленная операция: " + duration + "мс");
}

2. Оптимизация RecyclerView

В AisTargetsAdapter добавьте:

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull List<Object> payloads) {
    if (payloads.isEmpty()) {
        super.onBindViewHolder(holder, position, payloads);
    } else {
        // Обновляем только измененные поля
        for (Object payload : payloads) {
            if ("time_update".equals(payload)) {
                updateTimeAgo(holder);
            }
        }
    }
}

3. Использование ViewStub для тяжелых компонентов

Для компонентов, которые не всегда видны, используйте ViewStub.

4. Оптимизация изображений маркеров

  • Используйте кеширование Bitmap'ов
  • Предварительно масштабируйте изображения
  • Используйте hardware acceleration где возможно

5. Мониторинг памяти

Добавьте проверки на утечки памяти:

if (BuildConfig.DEBUG) {
    Runtime runtime = Runtime.getRuntime();
    long usedMemory = runtime.totalMemory() - runtime.freeMemory();
    long maxMemory = runtime.maxMemory();
    if (usedMemory > maxMemory * 0.8) {
        Log.w(TAG, "Высокое использование памяти: " + (usedMemory / 1024 / 1024) + "MB");
    }
}

Результат оптимизаций:

  • Снижена частота обновлений UI в 2-5 раз
  • Добавлен throttling для предотвращения блокировок
  • Улучшена обработка ошибок
  • Снижена нагрузка на главный поток

Эти изменения должны значительно уменьшить зависания UI и улучшить общую производительность приложения.