generated from Grigo/AndroidTemplate
b5aee265bc
Архитектурные улучшения: - Внедрен 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
4.5 KiB
4.5 KiB
Оптимизации производительности 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 и улучшить общую производительность приложения.