To pytanie jest dla kogoś, kto rozumie wnętrze MapBox GL JS.Przyczyna różnicy wydajności MapBox GL JS
Używam MapBox GL JS do renderowania mapy geograficznej zawierającej do 40 000 wielokątów, z których każdy jest kolorowy w oparciu o "właściciela" tego wielokąta. Zazwyczaj istnieje wiele wielokątów na właściciela, a "właściciel" każdego wielokąta może się zmieniać z czasem. Liczba właścicieli może wynosić od jednego do około 1000. Mam problemy z wydajnością (które różnią się w zależności od tego, jak do niego podchodzę), więc wypróbowałem kilka różnych strategii.
- Korzystanie z stylizacji opartej na danych dla "wypełnienia kolorem", gdzie mam pojedyncze źródło i pojedynczą warstwę. Próbowałem zarówno identyfikator wielokąta i "właściciela" id jako kategorię dla stylu opartego na danych.
- Używanie filtrowanych warstw, w których mam pojedyncze źródło i osobną warstwę dla każdego "właściciela". Ponownie wypróbowałem zarówno identyfikator wielokąta, jak i "właściciela", jako kryteria filtrowania.
- Użycie osobnego źródła i warstwy dla każdego "właściciela".
Opcja trzecia ma najlepszą prędkość rysowania. Warstwy są renderowane bardzo szybko podczas przybliżania i przesuwania. Ale muszę wywołać setData za każdym razem, gdy zmienię właściciela warstwy, a setData wycieknie z pamięci, więc w końcu skończę z awarią strony. Ten numer 2607 został zamknięty, ponieważ nie można go podjąć, więc nie spodziewam się rozwiązania tego problemu.
Opcje jeden i dwa rysują dobrze przy początkowym powiększeniu, ale po powiększeniu są bardzo powolne, aby ponownie rysować płytki. Utknąłem, patrząc na poszarpane, mało szczegółowe kafelki, aż rendering dogoni po 20-30 sekundach. Zauważ, że jeśli użyję identyfikatora "owner" zamiast identyfikatora "polygon", nadal będę musiał wywołać setData, gdy zmieni się "właściciel", co doprowadzi do wycieku pamięci. Jeśli używam identyfikatora wielokąta, wystarczy zaktualizować filtry warstw lub kategorie kolorów wypełnienia, gdy zmieni się "właściciel". Jednak nie dostaję zauważalnej różnicy w wydajności, jeśli używam identyfikatora "wielokąta", więc myślę, że to w porządku.
Moje pytanie brzmi: dlaczego opcja trzecia jest o wiele szybsza do renderowania po powiększeniu? Czy ma to związek z liczbą pracowników przydzielonych do losowania? W opcjach jeden i dwa istnieje jedno źródło, więc czy oznacza to, że rysunek korzysta tylko z jednego pracownika? Podczas gdy w opcji trzeciej istnieje oddzielne źródło dla każdego "właściciela", więc mam wielu pracowników wykonujących rysunek?
Wygląda na to, że wyciek pamięci związany z opcją 3 został naprawiony w wersji v0.29.0. – jasonpepper