Roads overlay: one polyline per segment + viewport culling (fix jank)

The per-pass thickness split fragmented each segment into a run per
weight change, turning a ~1.4k-segment network into ~84k polylines and
janking the map. Draw one polyline per segment at its median-pass width
instead (verified on device: 1430 vs 84083). Add buildRoadSegments
(segment + bbox) and cullRoadsInto (draw only segments meeting the padded
view, redraw on moveend/zoomend); the recording overlay now renders on a
canvas pane instead of SVG, and showRoadsMap culls too. Thickness is now
per-segment (median) rather than per-point — a deliberate simplification.
This commit is contained in:
4aiman 2026-10-23 01:11:15 +03:00
commit 4637846839
5 changed files with 117 additions and 68 deletions

View file

@ -0,0 +1,36 @@
# 2026-10-23 - Производительность: отсечение по видимой области для дорог и POI
## Контекст
Жалоба: дороги (BalDav) и POI (brouter-web) тормозят WebView. Задача - рисовать только то,
что в кадре, не плодить огромную отрисовку.
## Сделано
### Дороги (BalDav, frontend/js/main.js) - в этом коммите
- Настоящая причина лагов - правка толщины по проездам (прошлый коммит): drawRoadSegment дробил
каждый сегмент на run'ы по изменению веса -> 1430 сегментов превращались в ~84083 полилинии.
Исправлено: один сегмент = одна линия, толщина по МЕДИАННОМУ числу проездов сегмента. Проверено
на устройстве (0.1.515): 1430 вместо 84083.
- Добавлены помощники buildRoadSegments (сегменты + bbox) и cullRoadsInto (отсечение по
getBounds().pad), debounce. Экран записи переведён с SVG на canvas-пан; showRoadsMap и запись
рисуют только видимые сегменты, перерисовка на moveend/zoomend.
- Упрощение (объявлено): толщина теперь на уровне сегмента (медиана), не по каждой точке.
### POI (brouter-web, tools/brouter-web-staging + /var/www/brouter-web) - вне git приложения
- Отсечение по видимой области + порог зума на категорию (магазины z14, еда/туалеты/аптеки/
интересное z13, вода/АЗС/навесы z12, веломаг z11), предохранитель 800. Перекультивация на move.
- Проверено в браузере: магазины 17313 -> z15:192, z16:33; пан меняет счёт.
## Методическая ошибка (для истории)
Сначала гонял отсечение дорог по устройству через CDP и сделал вывод «не работает». Это артефакт:
WebView был в visibilityState=hidden (экран гас), а скрытая страница тормозит setTimeout, на
котором висит перерисовка. В реальном использовании (visible) идёт. Проверять надо в том же
состоянии экземпляра.
## Проверка
- Устройство 0.1.515: showRoadsMap -> 1430 полилиний (было 84083). Пан/зум плавность - проверять
руками на visible-экране.
- brouter-web: CDP, счётчики маркеров по зумам, пан.
## Дальше
- Если на записи ещё лагает - можно убрать debounce (рисовать синхронно, слоёв теперь мало).