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

96 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Оптимизации производительности 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. Мониторинг производительности
Добавьте логирование времени выполнения операций:
```java
long startTime = System.currentTimeMillis();
// операция
long duration = System.currentTimeMillis() - startTime;
if (duration > 16) { // больше одного кадра (60 FPS)
Log.w(TAG, "Медленная операция: " + duration + "мс");
}
```
### 2. Оптимизация RecyclerView
В AisTargetsAdapter добавьте:
```java
@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. Мониторинг памяти
Добавьте проверки на утечки памяти:
```java
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 и улучшить общую производительность приложения.