Rozważam różne architektury systemu, który idealnie wykorzystuje renderowanie po stronie klienta dla funkcji punktowych i musi być wolny od wtyczek. Korzystam z tej aplikacji opracowanej w odpowiedzi na to pytanie, aby przetestować mój laptop (który jest całkiem zdolny - czterordzeniowy procesor 2,6 GHz, pamięć 4 GB, nie pod żadnym innym obciążeniem, Firefox 8) z różną liczbą punktów w OpenLayers i zauważalnie pozostaje w tyle na poziomie 500 i zaczyna walczyć o ponad 1000. Losowo generowane funkcje nie wydają się mieć żadnych procedur obsługi zdarzeń i wszystkie używają tej samej symboliki.
Oczekuję, że pokażę do 1000 funkcji, z maksymalnie 10 różnymi symbolami, wszystkie z uchwytami do klikania i najechania myszką oraz na mniej wydajnych platformach.
Miałem nadzieję na lepszą wydajność po stronie klienta, zwłaszcza po zapoznaniu się z przykładem GIS Cloud - wiem, że działa inaczej (płótno HTML5 vs. SVG), ale różnica w wydajności jest naprawdę uderzająca.
Moje kluczowe pytania (jeśli byłbyś tak miły) to:
- Czy aplikacja generująca punkty losowe reprezentuje wydajność w innych aplikacjach OpenLayers, które napisałeś / wykorzystałeś?
- Czy istnieje sprawdzony i bezpłatny alternatywny interfejs API do mapowania stron internetowych, który obsługuje usługi WMS (z których muszę korzystać) i jest szybszy dzięki funkcjom po stronie klienta, bez użycia Flash / Silverlight / jakichkolwiek innych wtyczek?
- Wszelkie inne sugestie dotyczące tego, co powinienem badać?
Opieranie się przede wszystkim na renderowaniu po stronie serwera jest opcją, ale zarówno ja, jak i klient chcielibyśmy tego uniknąć ze względu na obawy związane ze zwiększeniem liczby użytkowników i szybkości reakcji interfejsu użytkownika.
Odpowiedzi:
Odpowiedź na pierwsze pytanie brzmi: tak . Używasz OL z dość powszechną konfiguracją. Są sztuczki, których możesz użyć, aby poprawić wydajność, przejdę do tego później.
Odpowiedź na pytanie 2 może być (szczególnie jeśli chodzi o szybkość). Możesz przeszukać tę stronę, aby znaleźć listę alternatyw (ta, która przychodzi Ci teraz na myśl, to Ulotka ).
Odpowiedź na pytanie 3: zacznij od pomiaru:
Zredagowałem lokalną kopię aplikacji, tak aby renderer został wyraźnie określony na liście opcji dla warstwy Vector. Podczas testów pominąłem renderer Canvas, a następnie ponownie załadowałem stronę eksperymentu z innym:
Dodałem licznik do funkcji przerysowania, aby wydrukował ile czasu spędził na rysowaniu :
Potem wypróbowałem kilka uruchomień zarówno w Chrome 17, jak i Firefox 8.0.1 na OSX SL, rysując funkcje 1000 i 5000. Ku mojemu zdziwieniu renderer SVG jest średnio o 20% szybszy niż renderer Canvas! (Uwaga: w systemie Windows czas js nie jest tak dokładny jak w OSX, więc wyniki mogą być mniej spójne).
To i twoje opowiadanie
, IMHO, informuje nas, że punkt aktywny znajduje się w obsłudze funkcji Vector. Pracując nad moją aplikacją, niedawno ją obejrzałem i postanowiłem podklasować ją, a następnie pozbyć się całego skomplikowanego kodu, który nie nadaje się na proste punkty. Trzeba przyznać, że zwariowałem i nawet usunąłem zależność od OpenLayers.Geometry.Point, a moja wersja działa teraz na prostych obiektach js z atrybutami x, y.
Dostępne są następujące opcje w kolejności korzyści / kosztów:
Pierwszą opcją jest filtrowanie widocznych punktów po stronie serwera poprzez skonfigurowanie opcji strategii do warstwy wektorowej w następujący sposób:
W ten sposób powiększenie liczby rysowanych elementów po stronie klienta będzie ograniczone do widocznych w tym zakresie, a nie wszystkich.
Jako drugą opcję możesz rozważyć napisanie dostosowanego Vector / Renderer . Przykład niestandardowej, uproszczonej i szybszej implementacji jest dostępny na mojej stronie github tutaj . Chociaż nie nadaje się do wszystkich zastosowań, powinno wystarczyć, aby z grubsza zorientować się, co sugeruję.
Trzecią opcją, gdy użytkownik jest całkowicie pomniejszony, jest zaimplementowanie pewnego rodzaju klastrowania funkcji po stronie serwera, tak aby punkty bliskie były scalane w jeden, ponownie zmniejszając liczbę rysowanych elementów.
źródło
Za pomocą UTFGrid i TileMill możesz wyświetlać nieograniczoną liczbę punktów z całkiem dobrą wydajnością. Wyświetlanie n losowych punktów jest rodzajem wymyślonego przykładu, który nie zadziałałby w tej sytuacji ani z GISCloud lub inną podobną magią - ponieważ hacki do wydajności wektorów zwykle wymagają znajomości pełnego zestawu danych i niektórych procedur wstępnego przetwarzania: zarówno TileMill, jak i GISCloud dużo płytek.
źródło