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,95 @@
|
||||
# Оптимизации производительности 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 и улучшить общую производительность приложения.
|
||||
|
||||
Reference in New Issue
Block a user