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:
parent
c7dd588f37
commit
4637846839
5 changed files with 117 additions and 68 deletions
36
docs/session-logs/2026-10-23_roads-poi-viewport-culling.md
Normal file
36
docs/session-logs/2026-10-23_roads-poi-viewport-culling.md
Normal 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 (рисовать синхронно, слоёв теперь мало).
|
||||
Loading…
Add table
Add a link
Reference in a new issue