Ускоряем изображения еще больше при помощи HTTP2 и Progressive JPEG

Ускоряем изображения еще больше при помощи HTTP2 и Progressive JPEG

От автора: прогрессивные изображения на HTTP2 быстрее отрисовываются на экране, что повышает восприятие производительности. Используйте сканирующие слои JPEG изображений для показа понятного контента при отправке всего лишь 25% от самого изображения. Для максимального увеличения производительности ключевых изображений используйте HTTP2 Server Push для сканирующих слоев JPEG.

Проблемы с изображениями

Изображения очень важны: они завлекают нас, бесят, побуждают к чему-либо. Интернет в известной нам форме зависит от изображений. Изображения составляют ~65% от общего веса страницы, а также они сильно связаны со временем загрузки страницы и индексом скорости. Если коротко, изображения очень тяжелые и все замедляют.

Сжимайте!

Ускоряем изображения еще больше при помощи HTTP2 и Progressive JPEG

Сжатие – лучший способ исправления отрицательного эффекта от загрузки изображений. С помощью сервисов типа ImageOptim от Kornel Lesiński, который использует замечательные библиотеки mozjpeg и pngquant, можно уменьшить вес изображений без визуальных потерь качества. Благодаря библиотекам типа DSSIM мы можем тестировать качество изображений на разных уровнях сжатия.

Плохая новость заключается в том, что даже после сжатия изображений в среднем на ~29% с помощью описанных выше инструментов, а также при использовании других форматов типа WebP, изображения все равно остаются самыми большими файлами на сайте. Ближайший собрат в этом отношении – JS. Нужно найти способ, как быстрее поставлять эти компоненты, чтобы быстрее завлекать пользователя.

Знакомство с многоканальной передачей

Ускоряем изображения еще больше при помощи HTTP2 и Progressive JPEG

Частично вопрос производительности решается с помощью HTTP2. Одно из главных преимуществ данного протокола – многоканальная передача – способность обрабатывать несколько запросов и ответов за раз, используя одно TCP соединение.

Многоканальная передача ускоряет загрузку файлов с сайта. В зависимости от структуры сайта можно выставить приоритет ресурсов при многоканальной передаче: если критическому CSS поставить высокий приоритет, он будет загружаться быстрее через HTTP2. Кроме того, подгружая еще не запрошенные файлы через HTTP2 Server Push, при правильном подходе можно серьезно улучшить восприятие производительности. Более подробно на эту тему чуть ниже.

Ускоряем изображения еще больше при помощи HTTP2 и Progressive JPEG

При загрузке изображений через многоканальную передачу данных появляется интересный побочный эффект: с точки зрения восприятия производительности отдельные типы изображений загружаются значительно быстрее из-за того, что первичная информация об изображении загружается параллельно через многоканальную передачу данных HTTP2. К таким типам можно отнести прогрессивный JPEG и чересстрочный PNG.

Все прогрессивно

Ускоряем изображения еще больше при помощи HTTP2 и Progressive JPEG

Прогрессивные и чересстрочные изображения похожи на слоеный пирог: информация в них хранится не в едином потоке, который отрисовывает изображения от верхнего левого угла до правого нижнего, а в форме стека, где каждый слой дополняет уже предоставленную ранее информацию. Отдельные слои весят намного меньше конечного файла.

Загрузка файлов с сайта через HTTP2 Multiplexing начинается одновременно, и первичные, легковесные слои прогрессивных и чересстрочных изображений начнут отрисовываться намного быстрее, чем последовательно закодированные изображения. Последовательно закодированные изображения отрисовываются наподобие жалюзи: стока за строкой, пока не загрузится все изображение.

Ускоряем изображения еще больше при помощи HTTP2 и Progressive JPEG

Джон Меллор из Google в 2012 году уже говорил о восприятии производительности и индексе скорости при загрузке сканирующих слоев прогрессивных JPEG изображений через HTTP2 Multiplexing. Он экспериментировал с протоколом SPDY, предшественником HTTP2. Сегодня мы можем продвинуть еще дальше его открытие и заставить прогрессивные изображения загружаться еще быстрее.

Возвращаем власть в наши руки или сканирующие файлы

Ускоряем изображения еще больше при помощи HTTP2 и Progressive JPEG

По умолчанию в прогрессивных JPEG изображениях 10 сканирующих слоев. То есть для загрузки изображения с исходным качеством проходит 10 итераций с загрузкой слоев с информацией. Первый слой JPEG изображений всегда имеет высокую пикселизацию и зачастую выполнен в черно-белом варианте для экономии на цветовых каналах. Хотите узнать, как выглядят все слои? Воспользуйтесь инструментом jsk от Frédéric Kayser, в котором прогрессивное изображение можно разбить на отдельные слои.

Почему именно 10 слоев? Это значение по умолчанию во всех стандартных кодировках JPEG. Так достигается идеальный баланс между размером каждого слоя и качеством, а также данное значение помогает достичь наименьшего веса конечного файла путем оптимизации через таблицы Хаффмана.

Ускоряем изображения еще больше при помощи HTTP2 и Progressive JPEG

В отличие от PNG изображений, где для создания черессточных слоев используется фиксированный метод кодировки Adam7, JPEG кодировки можно расширить директивами: флаг «-scans» для кодировок JPEG. С mozjpeg флаги можно использовать следующим образом: «cjpeg -quality 75 -scans customscans.txt -outfile output.jpg input.jpg». Кодеры JPEG принимают текстовые файлы с вашими командами для создания слоев.

Каждая строка в сканирующих файлах задает новый сканирующий слой. Каждый слой хранит много информации о цветовом канале, индексе матрицы и потерях.

В сканирующем файле есть три канала – яркость (Y), синий (Cb) и красный (Cr) под номерами 0, 1 и 2 соответственно. Индекс матрицы в файле начинается с 0 и идет до 63, покрывая блок в 64 пикселя (кодировка JPEG имеет блок 8х8).

Креативим

Ускоряем изображения еще больше при помощи HTTP2 и Progressive JPEG

Наша цель – как можно быстрее показать осмысленное изображение, чтобы наш сайт отрисовывался быстрее. Наш первый сканирующий слой должен быть легким, но в то же время осмысленным, что приведет к резкому скачку восприятия производительности визуального качества.

Первый представленный слой в сканирующем файле обеспечивает нас подходящими цветами. Второй слой – это уже приемлемое превью изображения. На третьем и четвертом слое находится необходимая информация о цвете: красный канал расположен перед синим, так как красный канал намного важнее для повышения визуального качества, например, при показывании лиц. Последний пятый слой дает нам конечное изображение с прорисовкой мелких деталей. Эти улучшения выливаются в примерный рост индекса скорости на 6%, что в свою очередь влияет на восприятие производительности.

Ускоряем изображения еще больше при помощи HTTP2 и Progressive JPEG

Ускоряем изображения еще больше при помощи HTTP2 и Progressive JPEG

Скрипт сканирования выше – лишь один пример настройки кодировки прогрессивных JPEG изображений: используя этот подход, можно воссоздать технику LQIP от Guy Podjarny в прогрессивных изображениях JPEG, как показал Jon Sneyers.

Push! Push! Push!

Для еще более быстрой загрузки изображений в HTTP есть еще один инструмент — Server Push. На серверах с поддержкой HTTP2 есть возможность помечать отдельные слои прогрессивных JPEG изображений высоким приоритетом, что заставит сервер передать эти слои в Push-кэш браузера пользователя еще до самого запроса на изображение. Браузеры могут выстраивать структуру страницы и отрисовывать первичные слои изображения из кэша, ускоряя тем самым для пользователей воспринимаемую отрисовку изображений.

Более подробно изучить HTTP2 Server Push можно в замечательной статье в разделе Performance Advent Calendar.

Ускоряем изображения еще больше при помощи HTTP2 и Progressive JPEG

Ускоряем изображения еще больше при помощи HTTP2 и Progressive JPEG

Данную технику стоит использовать только для выстраивания стратегии: выясните, какие изображения в первую очередь влияют на привлечение пользователей на странице, например, баннеры, пробуждающие определенные эмоции, или изображения с обзором на товар, и используйте Server Push для загрузки первичных слоев этих JPEG изображений. Так вы привлечете пользователей, что выльется в повышение конверсии без ущерба общей загрузки сайта.

Заключение

Благодаря многоканальной передаче через HTTP2, прогрессивные и чересстрочные изображения отрисовываются гораздо быстрее.

Управление созданием прогрессивных JPEG изображений может дать пользователю лучший визуальный опыт.

HTTP2 Server Push может улучшить восприятие производительности важных изображений.

Автор: Tobias Baldauf

Источник: //calendar.perfplanet.com/

Редакция: Команда webformyself.

Метки:

Похожие статьи:

Комментарии Вконтакте:

Комментарии (1)