10
105
Fork
You've already forked web
30

Performance de l'appli Web #218

Open
opened 2024年03月09日 22:54:05 +01:00 by laem · 21 comments
Owner
Copy link

🇬🇧 Performance 🇬🇧

Some say that Web maps cannot be swift. Indeed, cartes.app is currently slower than Organic Maps when you dezoom the map. Our mobile drawer component is also a bit more laggy.

I'm convinced we can optimize all that and approach parity. Here are some ideas.

React performance

I did not find any evident lag.

Maplibre performance

  • Iterate on reducing the load of our tiles / our maplibre style.

There's no simple way to do that (I asked the team here) : you have to try and learn by deactivating some layers and see

  • well at least, load lazily the non-main styles

  • for high zooms, reduce the size of the bathymetry data <- not done, but studied below

Interface js load

  • reduce the size of the bundle. We can probably move some local data to APIs for instance
    • check how heavy terradraw is. Load it lazily if needed.

Done with large optimisations in !1401

️4 days

🇬🇧 Performance 🇬🇧 Some say that Web maps cannot be swift. Indeed, cartes.app is currently slower than Organic Maps when you dezoom the map. Our mobile drawer component is also a bit more laggy. I'm convinced we can optimize all that and approach parity. Here are some ideas. ## React performance - [x] Test https://github.com/kristiandupont/react-geiger I did not find any evident lag. ## Maplibre performance - [x] Iterate on reducing the load of our tiles / our maplibre style. There's no simple way to do that (I asked the team [here](https://github.com/maplibre/maplibre-gl-js/discussions/5077)) : you have to try and learn by deactivating some layers and see - [x] well at least, load lazily the non-main styles - [x] for high zooms, reduce the size of the bathymetry data <- not done, but [studied below](https://codeberg.org/cartes/web/issues/218#issuecomment-13230312) ## Interface js load - [x] reduce the size of the bundle. We can probably move some local data to APIs for instance - [x] check how heavy terradraw is. Load it lazily if needed. Done with large optimisations in !1401 ⌚️4 days
Author
Owner
Copy link
  • perf : quand on zoom sur une ville depuis la France, le composant Content et le Map sont re-rendus des dizaines de fois ! Ce n'est pas très intensif comme calculs, mais ça reste inutile. Il semblerait que React Compiler n'arrive pas à automatiquement mémoïser plusieurs paramètres. Ça ne me semble pas être la mer à boire, on peut investiguer ça.

Comment by @altonss :

cartes.app is indeed a bit slow, especially when moving the map, and reloading missing tiles/data is very slow. This is a bit related to https://github.com/cartesapp/cartes/issues/218, but the general performance of the website should be improved to ensure a smooth experience, and not to await too much loading :)

- [x] perf : quand on zoom sur une ville depuis la France, le composant Content et le Map sont re-rendus des dizaines de fois ! Ce n'est pas très intensif comme calculs, mais ça reste inutile. Il semblerait que React Compiler n'arrive pas à automatiquement mémoïser plusieurs paramètres. Ça ne me semble pas être la mer à boire, on peut investiguer ça. Comment by @altonss : > cartes.app is indeed a bit slow, especially when moving the map, and reloading missing tiles/data is very slow. This is a bit related to https://github.com/cartesapp/cartes/issues/218, but the general performance of the website should be improved to ensure a smooth experience, and not to await too much loading :)
Author
Owner
Copy link

Je viens de tester cartes.app sur un téléphone de dernière génération : c'est parfaitement fluide. Vraiment impressionnant, je n'aurais jamais cru. Ça montre une chose simple : si l'expérience est lente sur un téléphone, c'est que ce dernier n'arrive pas à tenir la charge imposée le rendu GPU de la carte, ou par les re-rendus React.

C'est bon à savoir, même si ça ne doit pas conduire à négliger le sujet de la perf, sans WebGPU on ne pourra pas le résoudre entièrement.

Je viens de tester cartes.app sur un téléphone de dernière génération : c'est parfaitement fluide. Vraiment impressionnant, je n'aurais jamais cru. Ça montre une chose simple : si l'expérience est lente sur un téléphone, c'est que ce dernier n'arrive pas à tenir la charge imposée le rendu GPU de la carte, ou par les re-rendus React. C'est bon à savoir, même si ça ne doit pas conduire à négliger le sujet de la perf, sans WebGPU on ne pourra pas le résoudre entièrement.
Author
Owner
Copy link

Demo of the good performance of the app on a last generation smartphone. This is a good achievment, that should not make us forget lower-end phones of course. But the Web has some intrisic limits.

Demo of the good performance of the app on a last generation smartphone. This is a good achievment, that should not make us forget lower-end phones of course. But the Web has some intrisic limits.
Author
Owner
Copy link

Pour debugguer le mobile : 916f10aa35

Pour debugguer le mobile : 916f10aa3556c96c4fe7efd5ece395e8b1259932
Author
Owner
Copy link

J'ai fait des tests sur un Fairphone 5. Il s'avère qu'a priori, c'est bien un souci de performance du GPU car le nouveau fond "arbres" est très fluide.

Donc il va falloir osculter nos tuiles pour réduire les calques trop complexes. cc @etienneJr
Si ça se trouve, on a un ou deux calques qui ralentissent tout le reste. Mais je n'ai pas trouvé d'outil facile pour tester ça à l'échelle.

J'ai fait des tests sur un Fairphone 5. Il s'avère qu'a priori, c'est bien un souci de performance du GPU car le nouveau fond "arbres" est très fluide. Donc il va falloir osculter nos tuiles pour réduire les calques trop complexes. cc @etienneJr Si ça se trouve, on a un ou deux calques qui ralentissent tout le reste. Mais je n'ai pas trouvé d'outil facile pour tester ça à l'échelle.

ah oui, j'ai déjà des idées ! Et aussi pour le style standard. J'ai remarqué des trucs bizarre l'autre jour, par exemple qu'il affiche encore h3-landcover aux zooms élevés en surzoomant à mort dans la tuile z9. Je peux investiguer ça.

ah oui, j'ai déjà des idées ! Et aussi pour le style standard. J'ai remarqué des trucs bizarre l'autre jour, par exemple qu'il affiche encore h3-landcover aux zooms élevés en surzoomant à mort dans la tuile z9. Je peux investiguer ça.

@laem wrote in #218 (comment):

le nouveau fond "arbres" est très fluide.

en y repensant : ça n'est pas un bon test car il utilise comme source l'ancien trees.pmtiles hyper léger et non planet.pmtiles. Donc tu gagnes aussi sur le chargement des tuiles

@laem wrote in https://codeberg.org/cartes/web/issues/218#issuecomment-10083060: > le nouveau fond "arbres" est très fluide. en y repensant : ça n'est pas un bon test car il utilise comme source l'ancien `trees.pmtiles` hyper léger et non `planet.pmtiles`. Donc tu gagnes aussi sur le chargement des tuiles

@laem wrote in #218 (comment):

Donc il va falloir osculter nos tuiles pour réduire les calques trop complexes.

Etant donné cartes/serveur#96 je parierai sur la couche de données landcover. C'est la plus grosse donc a priori celle avec le plus de points à calculer. Et puis les suivantes les plus lourdes, on ne peut pas trop s'en passer : transportation et transportation name.

Après, si on doit garder telle couche de données, mais en en masquant certaines couches de rendu, ça devient compliqué à investiguer en effet.

@laem wrote in https://codeberg.org/cartes/web/issues/218#issuecomment-10083060: > Donc il va falloir osculter nos tuiles pour réduire les calques trop complexes. Etant donné cartes/serveur#96 je parierai sur la couche de données `landcover`. C'est la plus grosse donc a priori celle avec le plus de points à calculer. Et puis les suivantes les plus lourdes, on ne peut pas trop s'en passer : `transportation` et `transportation name`. Après, si on doit garder telle couche de données, mais en en masquant certaines couches de rendu, ça devient compliqué à investiguer en effet.

Ah ! mais ! c'est tellement plus fluide sur mon ordi du boulot que sur mon ordi de la maison ! Il est plus récent, il doit avoir un meilleur GPU.

Ah ! mais ! c'est tellement plus fluide sur mon ordi du boulot que sur mon ordi de la maison ! Il est plus récent, il doit avoir un meilleur GPU.
Author
Owner
Copy link

en y repensant : ça n'est pas un bon test car il utilise comme source l'ancien trees.pmtiles hyper léger et non planet.pmtiles. Donc tu gagnes aussi sur le chargement des tuiles

Oui mais c'est le but. Certes les tuiles sont très légères, donc ça aide au téléchargement et au décodage, mais ensuite le zoom est très fluide. Ça permet d'évacuer une lenteur globale de l'app react / de l'encart mobile / etc.

> en y repensant : ça n'est pas un bon test car il utilise comme source l'ancien trees.pmtiles hyper léger et non planet.pmtiles. Donc tu gagnes aussi sur le chargement des tuiles Oui mais c'est le but. Certes les tuiles sont très légères, donc ça aide au téléchargement et au décodage, mais ensuite le zoom est très fluide. Ça permet d'évacuer une lenteur globale de l'app react / de l'encart mobile / etc.

OK compris, tu voulais, pour un besoin de dev, pouvoir tester l'app sans le ralentissement du rendu du fond de cartes.

Mais au delà, pour l'utilisateur, tu voudrais :
a. un mode léger (pour le réseau) avec un style ET des tuiles spécifiques ?
b. un mode léger (pour le CPU) avec un style simple MAIS les tuiles actuelles ?
b. qu'on optimise le mode standard actuel en simplifiant le style ?

OK compris, tu voulais, pour un besoin de dev, pouvoir tester l'app sans le ralentissement du rendu du fond de cartes. Mais au delà, pour l'utilisateur, tu voudrais : a. un mode léger (pour le réseau) avec un style ET des tuiles spécifiques ? b. un mode léger (pour le CPU) avec un style simple MAIS les tuiles actuelles ? b. qu'on optimise le mode standard actuel en simplifiant le style ?
Author
Owner
Copy link

a. un mode léger (pour le réseau) avec un style ET des tuiles spécifiques ?

Oui idéalement, mais c'est pas encore d'actualité.

À court-terme, je dirais plutôt b oui.

Mais pour revenir au test que j'ai fait récemment sur un vieux téléphone, c'était un Fairphone 3, qui a un GPU vraiment nul. Pas sûr qu'on soit si mauvais déjà aujourd'hui en fait, c'est juste qu'on peut pas cibler les vieux téléphone avec MapLibre.

> a. un mode léger (pour le réseau) avec un style ET des tuiles spécifiques ? Oui idéalement, mais c'est pas encore d'actualité. À court-terme, je dirais plutôt b oui. Mais pour revenir au test que j'ai fait récemment sur un vieux téléphone, c'était un Fairphone 3, qui a un GPU vraiment nul. Pas sûr qu'on soit si mauvais déjà aujourd'hui en fait, c'est juste qu'on peut pas cibler les vieux téléphone avec MapLibre.
Author
Owner
Copy link

For maplibre performance, this might help us, it's new :)

https://maplibre.org/maplibre-gl-js/docs/examples/display-performance-metrics/

For maplibre performance, this might help us, it's new :) https://maplibre.org/maplibre-gl-js/docs/examples/display-performance-metrics/
Author
Owner
Copy link

OK, I've implemented it in our app in 6806cfbdd, but now I don't really know what to do. But yes, map rendering performance looks like it goes down to 0 fps frequently.

image

OK, I've implemented it in our app in 6806cfbdd, but now I don't really know what to do. But yes, map rendering performance looks like it goes down to 0 fps frequently. ![image](/attachments/fac71818-c486-498d-847f-9a67b20e9926)
282 KiB
Author
Owner
Copy link
  • optimize Overpass requests
    • deploy our own overpass instance instead of the common, already overloaded, openstreetmap-fr instance
    • compress the nginx responses
    • restrict usage to our requests #2041
- [ ] optimize Overpass requests - [x] deploy our own overpass instance instead of the common, already overloaded, openstreetmap-fr instance - [x] compress the nginx responses - [ ] restrict usage to our requests https://codeberg.org/cartes/web/issues/2041
Author
Owner
Copy link

About

for high zooms, reduce the size of the bathymetry data

Idea : add MapTiler's Bathymetry, that are perfectly similar to ours (same source), to the map and compare the rendering time. To determine if their's is more optimized, or if it's just the data that's too dense.

About > for high zooms, reduce the size of the bathymetry data Idea : add MapTiler's Bathymetry, that are perfectly similar to ours (same source), to the map and compare the rendering time. To determine if their's is more optimized, or if it's just the data that's too dense.
Author
Owner
Copy link

OK, match !

Maptiler's
image

3,98 Mo and 5,6 s

Ours
image
2,85 and 4,42 s

Testing on a closer zoom in the Pacific ocean gives no better result to MapTiler's.

So it look like our version is not heavier, though it may have rendering artifacts, that would be caused by the too different sea background ?

Of course the possibility of downscaling them remains, for a generic map. But it may not be that easy.

OK, match ! Maptiler's ![image](/attachments/4724d231-a673-4d2f-bea3-c54210f9b0fb) 3,98 Mo and 5,6 s Ours ![image](/attachments/55d08ff3-215f-4ded-8354-b208ad874d00) 2,85 and 4,42 s Testing on a closer zoom in the Pacific ocean gives no better result to MapTiler's. So it look like our version is not heavier, though **it may have rendering artifacts**, that would be caused by the too different sea background ? Of course the possibility of downscaling them remains, for a generic map. But it may not be that easy.
688 KiB
536 KiB

et si on appliquait la bathymetry seulement sur le fond plein air ?

et si on appliquait la bathymetry seulement sur le fond plein air ?
Author
Owner
Copy link

et si on appliquait la bathymetry seulement sur le fond plein air ?

Je trouverais ça dommage, je trouve ce fond magnifique et super instructif. Par contre on pourrait en utiliser une version plus légère sur le fond normal.

Gardons en tête que sur 90 % de l'usage quotidien, on est sur terre, et même sur les zones côtières on n'affiche qu'une fraction des données de cette source :)

C'est plus pour l'effet démo du globe que c'est dommage qu'il pompe autant.

> et si on appliquait la bathymetry seulement sur le fond plein air ? Je trouverais ça dommage, je trouve ce fond magnifique et super instructif. Par contre on pourrait en utiliser une version plus légère sur le fond normal. Gardons en tête que sur 90 % de l'usage quotidien, on est sur terre, et même sur les zones côtières on n'affiche qu'une fraction des données de cette source :) C'est plus pour l'effet démo du globe que c'est dommage qu'il pompe autant.
Author
Owner
Copy link

Not striclty related to map performance, but we're trying to come back to the upstream react-modal-sheet in #2062 to benefit from the recent updates to this lib.

Not striclty related to map performance, but we're trying to come back to the upstream react-modal-sheet in #2062 to benefit from the recent updates to this lib.
Author
Owner
Copy link

Good news : maplibre just landed a perf optimisations for texts with halo. We use them a lot.

GPU performance optimization: Render halo and glyph in a single pass (-40% Time Reduction) (#7436) (by @xavierjs)

There are other optimizations as well.

https://github.com/maplibre/maplibre-gl-js/releases

Good news : maplibre just landed a perf optimisations for texts with halo. We use them a lot. > GPU performance optimization: Render halo and glyph in a single pass (-40% Time Reduction) (#7436) (by @xavierjs) There are other optimizations as well. https://github.com/maplibre/maplibre-gl-js/releases
Sign in to join this conversation.
No Branch/Tag specified
master
abostats
SynchroM-master
gps
embeddings
lysios-patch-5
lysios-patch-4
lysios-patch-3
lysios-patch-2
lysios-patch-1
abo-serveur2
clim
zone-en-favori
categories_toujours_visibles
rechercher_ici_avant_resultats
test-2365
panoramax-contribution
add-categories-validations
gel-bug-prod
osm-note-2
broken
wikidata_booking
fuse7.3
lysios-patrimoine-3
gps2
atproto-fix-2
styles-secondaires-mais-maison
atproto-scopes
itineraire-printemps-2026
modal-sheet-5.6
nlnet-cost-climate-perf
pb-icones-religieux
couvoiture
etiennejr-patch-2
meteo-fainéante
logo-static-url
poc-page-vitrine
remove-compass
test-reproduce-1795
display-cycleway-lanes-2
poc-image
add-media-condition
mapterhorn
test-indoor-equal
outdoors-VS-indoorEqual
hiking-colors
fix-blog-typing
poc-next-international
fix-map-style-modal-not-closing
i18n
hide-odd-zoom-levels
filter_categories
resume_wikipedia
deplacement_bouttons
fix-1095
mobile_permettre_selection
position-carte-initiale
dégradé-icônes
better_wikipedia
affichage_donnees_wikidata
mobile-permettre-selection
avis-details
perf-seo
modal-sheet-5
plans-novembre
display-cycleway-lanes
fix-1227
fix-1234
etiennejr-patch-1
update-1240
fix-1236
fix-1131
photon-search-street
fix-1221
article-avis
net-haut-zoom
baies-moins-visibles
belles-fiches-lieu
fix-1157
bug-page-vie-privée
use-watername
fix-1176
carte-du-onde
fix-1166
page-news
tchou
add-icon-alias
vitesse
photon-opensearch
private-in-italic
bâtiments-3D
merge-categories
handle-private-highway
improve-findcategory
injection-pmtiles
fix-1128
check-icons
update-readme
category-rugby
bug-position-carte-vs-lieu
limites-vitesse
improve-find-category-from-tags-v2
integrer
document-osmfeature
translate-document
velo-fin-aout-25
velo-ete-2025
moins-de-maptiler
planet-pmtiles-tilemaker
fix-1048
panoramax-leger
plume
horaires-i18n
planet
maj-deps-juillet-2025
improve-find-category-from-tags
bug-encart
interactions-encart-mobile
clic-on-station
fix-1028
fix-1014
edit
add-big-rivers
add-shortbread-tiles
handle-deleted-osm-elements-v2
codeberg
improve-useEffect
immoloc
update-dashboard
analyze
terradraw
sombre2
calendar
poi-sprites-using-svg
style-sombre
sprites
annuaire
motis-gtfs-attributes
next-styled-components
dev
cool2
cool
panoramax-angle
env-static-urls
borders-only
panoramax2
intelligence
debug-iles
nouveau-serveur
france-protomaps
turbo
fouss/cartes-#338
blog2
legislatives
presentation
pas-de-geoloc-si-hash-different
protomaps
vaul
carte-trains
citiz
maj-paquets
icones
ui2
bblog
voyagevoyage
test-image-origine
bugimagefin
searchParams
voyage
avion
perf
studio
piscine
journée
année
journée-transition
score-dès-acceuil
fix-space-problem
rebase-5août
correspondance
règles-séparées
indeps-acre
demo
indeps
indeps-cachés
indication-temps-plein
indeps-refactor-simulations
indeps-vue-comparaison
indeps-inversion
barème-continu
indeps-démo
textes-branches-sécu
engine-enum
2019
transport
publicodes
as
infrance-nouvelle-landing
better-translation
co2
simplifATMP
controle-SMIC
webi18n
bug-avantages-en-nature
revert-352-infrance-navigation-v2
laem-patch-1
robots.txt
improve-perf
iframe-bugfix
quickfixes
lib
irsimple
hiringinfrance.com
dégradé
refstate
johan
zrr
logo-interactif
revert-216-improve-tracking
redesign2
zrr2
fixtrad
correction-salaire-brut
petit-state
alien-consolidate
translate-ui
npm
alien-brut-net
translatable
différent
ir18
fix-typo
add-tracking
fix-collect-missing
défauts-partout
fix-double-unfold-three
fix-double-unfold
versement-transport
blocker-questions
v3
v2.1
v2
v1
v0.6.4
v0.6.3
v0.6.2
v0.6.1
v0.6.0
0.7.0
v0.5.1
v0.5.0
v0.4.2
v0.4.1
v0.4.0
v0.3.3
v0.3.2
v0.3.1
v0.3
v0.2
v0.1-cdd-alpha
v0-démo-tag-nav
Labels
Clear labels
🎨 Design
À propos de l'interface et de l'UX
💡 Idée
Nouvelle feature à intégrer
question
Further information is requested
🌍 OSM
À propos de l'affichage et l'édition des éléments OSM
🌱 Amélioration
Amélioration/fix de l'existant
🐞 Bug
Something isn't working
📊 SEO
📋 Catégories
À propos des catégories de recherche et de l'annuaire
📖 Wiki
📝Avis
A propos de la fonction avis et de bluesky
📢 Oyez
📷 Photos
A propos des photos (sources, affichage)
🔍Recherche
A propos de la barre de recherche et de photon
🔥 Actuel
🔧 tech
🖌 Styles
Styles de la carte
🧝i18n
🧪 R&D
🚍 Transports
🚙 Voiture
🚨Prioritaire
Ticket à traiter rapidement
🚲Vélo
Cartes
climat
Communication
demo
Cette branche doit être déployée comme une démo
dependencies
Pull requests that update a dependency file
javascript
Pull requests that update javascript code
Pas urgent
Plein-air
Tuiles
Verso
Vieux
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
cartes/web#218
Reference in a new issue
cartes/web
No description provided.
Delete branch "%!s()"

Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?