Spojrzenie na stan progresywnych obrazów i percepcję użytkownika

Opublikowany: 2022-03-10
Szybkie podsumowanie ↬ Wszyscy chcemy szybko ładować obrazy w sieci. Wybór odpowiedniego formatu obrazu, optymalizacja jakości i korzystanie z responsywnych obrazów to ważne zadania, ale co możemy zrobić poza tym?

„Obrazy progresywne” to obecnie gorący temat. Często spotykamy artykuły wyjaśniające techniki, jak uniknąć pokazywania pustej przestrzeni, w której zostanie załadowany obraz. Medium i Facebook to przykłady stron internetowych i aplikacji mobilnych, które stosują ten wzorzec.

Niedawno pisałem o różnych sposobach wykorzystania SVG jako symboli zastępczych, a tegoroczny kalendarz wydajności PerfPlanet zawierał dwa posty, które dokładniej opisują SQIP, technikę opartą na rozmytych plikach SVG: Progresywne ładowanie obrazu przy użyciu obserwatora przecięcia oraz SQIP i SQIP — niejasne wektory dla wydajnych podglądów.

Kiedy po raz pierwszy udokumentowałem technikę ładowania obrazu Medium, byłem zainteresowany głównie inżynierią wsteczną ich techniki. Widziałem efekt przeglądania Medium na wolnym połączeniu podczas lotu. Pomyślałem, że wczesne renderowanie małego obrazu, leniwe ładowanie i przejście do ostatecznej wersji to dobry pomysł.

Zakładamy, że te techniki poprawiają postrzeganą wydajność użytkownika . Szybkie renderowanie bije wolne renderowanie. Wczesne umieszczenie czegoś na ekranie użytkownika, nawet jeśli nie jest to ostateczna treść.

Czy jesteśmy tego pewni?

Przeglądając kilka komentarzy na Reddit, znalazłem wiele wnikliwych (i negatywnych) opinii. Oto dwa z nich:

„Nienawidzę stron internetowych, które pokazują rozmytą wersję obrazu przed załadowaniem ostatecznego. Bawi się moimi oczami. Muszę odwrócić wzrok i zerknąć, żeby zobaczyć, czy to się skończyło, zanim będę mógł czytać dalej. Chciałbym, żeby istniał sposób na wyłączenie tej funkcji”.
— rocky1138, Hacker News
„W jaki sposób ludzie doszli do wniosku, że wyświetlanie wersji obrazu o niskiej zawartości informacji do załadowania jako symbolu zastępczego skutkuje szybszym postrzeganiem ładowania? Dla mnie wszystkie te efekty są po prostu śmieciowe i rozpraszające, bez żadnych korzyści — na pewno nie postrzeganie szybkości. To nie tak, że kiedykolwiek zrozumiem, czym naprawdę jest obraz, zanim i tak zostanie w pełni załadowany, z naszym bez fantazyjnym symbolem zastępczym”.
— dwb, Hacker News
Więcej po skoku! Kontynuuj czytanie poniżej ↓

Próbuję znaleźć badania na temat postrzegania użytkowników

Chciałem znaleźć jakieś badania naukowe, które mogłyby potwierdzić, że te techniki ładowania obrazów są (lub nie) korzystne. To okazało się wyzwaniem. Nie udało mi się znaleźć żadnego badania dowodzącego, że wyświetlanie czegoś takiego jak rozmyta miniatura przed załadowaniem obrazu poprawia percepcję użytkownika. Potem pomyślałem o progresywnych JPEG-ach.

Powrót do podstawy: progresywne pliki JPEG

W pewien sposób przez długi czas stosowaliśmy podobną „technikę progresywnego ładowania obrazów”. Dobrym przykładem jest progresywny JPEG.

Progresywne pliki JPEG zostały zaproponowane jako dobra praktyka w przypadku obrazów, zwłaszcza w przypadku witryn używanych w wolnych sieciach. Ann Robson napisała post zachęcający do tworzenia progresywnych plików JPEG, teraz pięć lat temu, w którym podsumowała, dlaczego są one lepsze:

„Progresywne pliki JPEG są lepsze, ponieważ są szybsze. Pojawianie się szybciej oznacza szybsze, a postrzegana prędkość jest ważniejsza niż rzeczywista prędkość . Nawet jeśli jesteśmy chciwi na to, co staramy się dostarczyć, progresywne pliki JPEG dają nam jak najwięcej tak szybko, jak to możliwe”.

Progresywny JPEG koduje obraz na kilka skanów. Pierwszy skan renderuje pełny obraz w niskiej jakości i jest poprawiany w miarę renderowania większej liczby skanów. Alternatywą jest podstawowy tryb JPEG, w którym obraz jest dekodowany od góry do dołu.

Dekodowanie bazowe obrazu JPEG
Dekodowanie bazowe obrazu JPEG.
Progresywne dekodowanie obrazu JPEG
Progresywne dekodowanie obrazu JPEG.

Na marginesie, kodowanie JPEG można dostosować za pomocą różnych skryptów skanowania. Można to wykorzystać do tworzenia obrazów zakodowanych w trybie hybrydowym między linią bazową a progresywnym.

Techniki progresywne, takie jak Blur-up, SQIP przypominają progresywne pliki JPEG z punktu widzenia użytkownika. Przeglądarka najpierw renderuje obraz o niskiej jakości, a po załadowaniu zastępuje go ostatecznym obrazem.

Co ciekawe, zdecydowana większość obrazów JPEG korzysta z trybu bazowego. Według niektórych źródeł progresywne pliki JPEG stanowią najwyżej 7% wszystkich plików JPEG. Jeśli wydaje się, że zgadzamy się, że te techniki poprawiają postrzeganą przez użytkownika wydajność, dlaczego progresywne pliki JPEG nie są używane szerzej niż podstawowe pliki JPEG?

Badania

Udało mi się znaleźć tylko badanie zatytułowane „Progresywne renderowanie obrazu – dobro czy zło?”, które próbowało rzucić trochę światła na ten temat.

„Kiedy, podobnie jak w przypadku metody progresywnego JPEG, odtwarzanie obrazu jest procesem dwuetapowym, w którym początkowo szorstki obraz zostaje wyostrzony, płynność poznawcza jest zahamowana, a mózg musi nieco ciężej pracować, aby zrozumieć, co jest wyświetlane ”.

Według badania użytkownikom trudniej jest przetwarzać progresywne pliki JPEG, chociaż na pierwszy rzut oka wydaje się, że jest to lepsze.

Niedawno wspomniałem o badaniu w rozmowie o LQIP (Low-Quality Image Placeholders). Wkrótce otrzymałem kilka odpowiedzi kwestionujących rygor badania:

Jak dotąd mamy jedno badanie, które jest przyjmowane ze sceptycyzmem. Co jeszcze mamy? Czy możemy wykorzystać istniejące narzędzia do pomiaru postrzeganej wydajności jako proxy?

Pomiar postrzeganego czasu obciążenia

Wyobraź sobie te dwa hipotetyczne taśmy filmowe nagrane z witryny:

Diagram przedstawiający 2 hipotetyczne taśmy filmowe dla tej samej witryny. Wersja A renderuje puste strony, a następnie całą zawartość na raz. Wersja B pokazuje częściową zawartość podczas ładowania.
Diagram przedstawiający 2 hipotetyczne taśmy filmowe dla tej samej witryny.

Ogólna zgoda jest taka, że ​​użytkownik zauważy, że wersja B ładuje się szybciej niż wersja A. Dzieje się tak, ponieważ części strony są renderowane wcześniej niż w wersji A.

W pewnym sensie sytuacja przypomina progresywne obrazy, ale na większą skalę. Częściowa treść tak wcześnie, jak to możliwe, nawet jeśli nie jest to ostateczna.

Czas ładowania strony wynoszący 1,2 sekundy mówi nam część historii, ale nie opisuje tego, co użytkownik widzi w tym czasie. Obecnie używamy danych, takich jak indeks prędkości, aby ocenić, jak szybko wczytuje się strona. Indeks prędkości mierzy obszar strony, który nie jest uzupełniony wizualnie. Odbywa się to na kilku zrzutach ekranu wykonywanych w odstępach czasu. Im niższa liczba, tym lepiej.

Formuła indeksu prędkości
Formuła Indeksu Prędkości (Źródło)

Jeśli myślimy o technikach progresywnego ładowania obrazu, jak indeks prędkości będzie się zmieniać podczas ładowania obrazu? Czy ten obszar zostanie uznany za „zakończony wizualnie”, jeśli użyjemy symbolu zastępczego niskiej jakości?

Początkowo Speed ​​Index mierzył postęp, porównując odległość histogramów, po jednym na każdy kolor podstawowy (czerwony, zielony, niebieski). Nazywa się to średnią różnicą histogramu. Celem jest zapobieganie takim zmianom, jak zmiany układu stron, w których wszystkie elementy na stronie są przesunięte o kilka pikseli, aby nie miały dużego wpływu na obliczenia. Aby uzyskać więcej informacji na temat algorytmu, przeczytaj sekcję Pomiar postępu wizualnego w dok. Indeks prędkości.

Zdecydowałem się wypróbować Webpagetest na stronie, która wyświetla symbole zastępcze niskiej jakości (patrz raport dotyczący WebPageTest):

Taśma filmowa pokazująca procentową wizualną kompletność
Taśma filmowa pokazująca procentową wizualną kompletność (patrz raport na WebPageTest).

Możemy zauważyć, że między 8 a 10 sekundą obraz ładuje się. Rozmyty symbol zastępczy zwiększa procent kompletności wizualnej z 75% do 83%. Załadowanie ostatecznego obrazu zabiera go z 83% do 93%.

Widzimy, że symbol zastępczy przyczynia się do wizualnej kompletności strony mierzonej przez indeks prędkości. Możemy również zauważyć, że symbol zastępczy nie liczy się jako w pełni wizualnie kompletny obszar.

Indeks prędkości nie jest jedyną metryką, której możemy użyć do uzyskania pomiaru szybkości renderowania naszej strony. Narzędzia dla programistów Chrome zawierają opcję przeprowadzenia audytu wydajności. Przejdź do AuditsPerform an auditCheck 'Performance'Run audit .

Przeprowadzenie audytu generuje taki raport:

Zdjęcie telefonu ładującego artykuł na Medium, z widocznym rozmytym symbolem zastępczym.
Wczytuję historię na Medium. Zwróć uwagę na rozmyty symbol zastępczy obrazu, który później zanika w ostatecznym obrazie.

Jednym z raportowanych wskaźników jest „Indeks szybkości percepcyjnej”. W tym przebiegu wartość wynosi 4,245 . Ale co dokładnie oznacza ten termin? Czy to to samo co „Indeks prędkości” Webpagetest?

Podejście Speed ​​Index do mierzenia podobieństwa pod względem pikseli, zwane również „średnią różnicą histogramu”, ma pewne wady. MHD nie rejestruje wizualnej percepcji kształtu, koloru ani podobieństwa obiektów.

Cztery różne kształty z równą ilością czarnych i białych pikseli.
Cztery różne kształty z równą ilością czarnych i białych pikseli.

W większości przypadków nie będzie to miało większego znaczenia podczas przeprowadzania wizualnej oceny kompletności. W praktyce Indeks Prędkości oraz Indeks Prędkości Percepcyjnej mają wysoką korelację:

„W szeroko zakrojonych badaniach empirycznych, które przeprowadziliśmy (przy użyciu ponad 500 najlepszych filmów wideo ze stron internetowych Alexa zebranych za pośrednictwem WebPagetest), stwierdziliśmy, że SI i PSI są liniowo skorelowane (a dokładnie 0,91).” — Percepcyjny indeks prędkości (PSI) do mierzenia wydajności sieci nad zakładką

Percepcyjny indeks prędkości

Zgodnie z dokumentacją Lighthouse firmy Google, indeks prędkości percepcyjnej jest obliczany za pomocą modułu węzła o nazwie Speedline. Ten pakiet oblicza percepcyjny indeks prędkości w oparciu o tę samą zasadę, co oryginalny indeks prędkości, ale oblicza wizualną progresję między klatkami przy użyciu SSIM zamiast odległości histogramu .

SSIM (podobieństwo strukturalne) służy do pomiaru podobieństwa między dwoma obrazami. Ta metoda ma na celu modelowanie sposobu, w jaki ludzie postrzegają obrazy, i uchwyca podobieństwo kształtu, koloru i obiektu. SSIM ma inne ciekawe zastosowania: Jednym z nich jest optymalizacja ustawień kompresji obrazu, na przykład cjpeg-dssim, który wybiera najwyższy poziom kompresji JPEG i generuje obraz o wystarczająco bliskim SSIM.

Poniżej możesz zobaczyć wyniki Image SSIM JS dla obrazów SVG utworzonych za pomocą Primitive. Im więcej użyjemy kształtów, tym bliżej oryginalnego obrazu (SSIM = 1).

Dwa obrazy odtworzone przy użyciu 100 i 10 trójkątów. Więcej kształtów sprawia, że ​​obraz jest bardziej zbliżony do oryginalnego.
Dwa obrazy odtworzone za pomocą trójkątów. Więcej kształtów sprawia, że ​​obraz jest bardziej zbliżony do oryginalnego.

Nowsze alternatywy dla SSIM to butteraugli (używane przez Guetzli, Perceptually Guided JPEG Encoder firmy Google) i SSIMULACRA (używane przez Cloudinary).

Wniosek

Nie ma prostego sposobu, aby zsyntetyzować postrzeganie przez użytkownika ładowania obrazu w czasie. Kierujemy się przeczuciem, że wcześniejsze wyświetlanie jest lepsze, nawet jeśli nie jest to ostateczna treść, chociaż niektórzy użytkownicy się z tym nie zgodzą.

Jako programiści musimy mierzyć wydajność . To jedyny sposób, w jaki możemy wyznaczać cele, aby je poprawić i wiedzieć, kiedy nie osiągamy budżetu skuteczności. Zaletą obstawiania progresywnego ładowania obrazu jest to, że możemy to zmierzyć za pomocą narzędzi opartych na percepcji użytkownika. Dają nam ocenę, są powtarzalne i skalowalne. Pasują do naszego przepływu pracy i narzędzi i są tutaj, aby pozostać.

Jako twórcy stron internetowych powinniśmy bardziej dbać o wczytywanie tworzonych przez nas witryn. Wspaniale, że mamy teraz narzędzia takie jak WebPageTest i Lighthouse, które mogą nam w łatwy sposób zmierzyć efekt stosowania technik progresywnego ładowania obrazu. Żadnych więcej wymówek!