Видео как спиннер крутится: Спиннер крутится 46 секунд. Смотрите, что еще полезного можно сделать за это время

Содержание

7 + 1 способ анимировать спиннер / Хабр

Меня зовут Евгений Подивилов, я фронтенд-разработчик в команде «Лайфстайл». Я разрабатываю раздел «Развлечения». В этом разделе можно купить билеты на мероприятия или забронировать столик в ресторане.

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

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

С чего мы начинали

Однажды при открытии нескольких SPA-приложений разом топовый Макбук завыл. Мы провели расследование и выяснили, что причиной стал обычный спиннер:

Оказалось, что на него тратилось почти 10% ресурсов CPU! Мне стало интересно разобраться и все оптимизировать, и я погрузился в код.

Все замеры производились на конфигурации: Google Chrome версии 95. 0.4638.54; macOS Big Sur 11.6; MacBook Pro 15 Mid 2015, Intel Core i7 2.2Ghz, 16Gb DDR3.

Решение первое: React

Я начал с решения на React. Каждый цикл анимации вычислял значения, устанавливал их в стейт компонента, а затем использовал в render-функции. Каждые 16 мс запускались те механизмы React, за которые разработчики его так «любят». Не самое хорошее решение.

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

Цикл анимации на React

Кроме проблем с лишней работой бывают проблемы с потреблением памяти. График показывает сначала рост, а затем обрыв — освобождение неиспользуемой памяти. И такое происходит часто.

Потребление памяти на React

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

Массив colorTable хранит 10 константных значений. Его инициализация находится внутри функции анимации, поэтому мы создаем этот массив в каждом цикле, каждые 16 мс. Каждую секунду мы создаем десятки новых массивов, и это не очень хорошо.

JS — язык с автоматическим управлением памятью. Это значит, что разработчикам не надо задумываться над выделением памяти при создании чего-либо. Память выделяется автоматически, когда появляется массив, и освобождается автоматически, когда мы больше не используем его.

За процесс определения неиспользуемой памяти и ее освобождение отвечает Garbage Collector. Процесс определения неиспользуемой памяти трудозатратный для компьютера, и, чтобы минимизировать влияние на работу страницы, браузеры периодически запускают GC. Когда очень быстро создаются массивы, достигается некий предел, после которого браузер запускает GC и высвобождает всю неиспользуемую память. Потом все повторяется.

Подробнее про GC на примере Chrome можно прочитать на v8.dev.

Решение второе: SVG + JS

Сначала избавимся от React, чтобы избежать лишней работы и упростить график производительности.

Теперь на вкладке Performance цикл анимации выглядит проще, но не значительно лучше: self time задачи уменьшилось с 1,55 до 0,17 мс, но общее время снизилось только до 4,69 мс против 5,69 мс в версии с React.

Цикл анимации на SVG + JS

Проблемы с памятью уменьшились, но не исчезли. Если воспользоваться вкладкой Memory и сравнить heap snapshot до и после принудительного вызова GC, можно локализовать проблему памяти в недрах функции lerpColor, а точнее — в конкатенации строк во время формирования цвета.

Потребление памяти SVG + JS

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

С помощью JS меняем стили элемента path, что вызывает этап style. За ним вызывается layout, дальше paint и composite. Можно оптимизировать этот пайплайн и пропустить некоторые шаги, если использовать свойства, подходящие для анимаций. Например, пропустить этапы layout и paint, если анимация основана только на свойстве transform.

Сделать такую анимацию только на transform, кажется, не получится? «Чтобы сделать анимацию быстрой, нужно все писать на Canvas!» — подумал я.

Решение третье: Canvas

Перепишем все на Canvas. У него нет элементов и стилей. Меняя что-то, мы отрисовываем это на холсте без лишних этапов. Немного низкоуровнево, но мы же хотим лучшей производительности!

Выглядит неплохо, но замеры по-прежнему выдают не фантастические результаты. Рекалькуляции и ре-лайаута теперь нет, но много времени мы на этом не выиграли.

Цикл анимации на Canvas

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

Есть возможность распараллелить выполнение задач через web workers. Но в них нет доступа к DOM, а значит, мы не сможем менять состояния элементов. И я решил избавиться от JS. 

Решение четвертое: SVG + CSS

Я вернулся к SVG, но переписал все на чистом CSS и попытался сделать анимацию менее зависимой от основного потока. Результат кажется более простым для понимания: вместо сложных вычислений сдвига и цвета мы задаем лишь опорные точки, а все расчеты по интерполяции значений между этими точками берет на себя браузер. Разработчики браузеров наверняка сделали эти вещи оптимальнее, чем мы со своими велосипедами.

Результаты улучшились, но проблема с фризами анимации осталась. Не все свойства CSS анимируются в отдельном потоке. В CSS можно анимировать с высокой производительностью только два свойства — transform и opacity. Зато с памятью теперь проблем нет.

Цикл анимации на SVG + CSSПотребление памяти на SVG + CSS

Решение пятое: SVG

Я отказался от JS, получится ли отказаться и от CSS?

SMIL — это Synchronized Multimedia Integration Language, такой HTML для анимаций. Можно запрограммировать анимации в виде разметки с помощью набора тегов и атрибутов. Можно изменить код так, что вся анимация будет только в SVG-файле.

Без JS. Без CSS. Работает практически везде, кроме IE. Такую анимацию можно подключить с помощью тега <img> или свойства background-image. Но блокировка основного треда по-прежнему блокирует нашу анимацию.

Решение шестое: Video

Видео кажется отличной идеей и имеет ряд преимуществ:

  • расчеты всех этапов анимации выполняются заранее и «зашиваются» в видео,

  • поддерживается всеми браузерами,

  • существуют аппаратные оптимизации для некоторых видео кодеков.

Все, что нам нужно — записать небольшой ролик и циклически воспроизводить его.

<video autoplay loop muted playsinline>
  <source src="spinner.mov" type='video/mp4; codecs="hvc1"' />
  <source src="spinner.webm" type="video/webm" />
</video>

Но есть и несколько минусов:

  • нужен прозрачный фон. Даже если не надо поддерживать IE 11, все равно нужно минимум два варианта видео: с кодеком VP9 — для Chrome и HEVC — для Safari;

  • менять размеры видео без потери в качестве не получится. Значит, нужно несколько видеофайлов под каждый размер спиннера;

  • перезапуск видео выполняется в основном потоке, хотя само видео выполняется в отдельном. Спиннер будет крутиться, пока не проиграет один цикл анимации.

Решение седьмое: CSS

Но если подумать, что такое видео? Набор кадров, которые очень быстро переключаются. Что, если использовать именно это качество в CSS?

Звучит как бред, но раз я решил пробовать все варианты, то почему бы и нет. С помощью черной магии ffmpeg разложил видео покадрово, а с image magic собрал атлас из полученных кадров. Главное, чтобы фон был прозрачным. С помощью простых и быстрых CSS-трансформаций я менял кадры:

Сработало! Даже при условии, что основной поток занят JS. Да, по-прежнему есть проблемы с ресайзом, но их можно решить с помощью нескольких атласов. Мы даже можем подгружать атлас на сайт с использованием lazy-атрибута. <sarcasm>Кажется, я нашел идеальное решение.</sarcasm> 

Выводы

Кроме разных способов анимации я хотел показать, что в большинстве случаев нам достаточно простых, но быстрых решений. Даже создатели популярной библиотеки компонентов material-ui пошли по пути сокращения потребления ресурсов и в пользу UX.

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

Решения рабочие, но использовать их в продакшене крайне сомнительно. Для обычного спиннера слишком много затрат. В итоге нам удалось убедить дизайнеров и бизнес, что будет лучше заменить наш вычурный индикатор на что-то попроще. Например, такое:

Результаты профилирования решений

  • Решение первое: React

  • Решение второе: SVG + JS

  • Решение третье: Canvas

  • Решение четвертое: SVG + CSS

  • Решение пятое: SVG

В Тюмени раскрутят самый большой в мире спиннер

Вслух.ru

Новости

Общество

Общество

Вслух.ру

4 сентября 2017, 06:23

Самый большой спиннер в мире раскрутят 5 сентября в 13.00 около здания ТИУ (ул. Мельникайте, 70). Его диаметр составляет 3,75 метра, а масса почти 30 кг. Мероприятие состоится в рамках акции «Спиннер крутится — госуслуги трудятся».

Как сообщили «Вслух.ру» в пресс-службе многофункционального центра, акция приурочена к началу учебного года. Во время её проведения студентам расскажут, как через портал gosuslugi.ru быстро и просто оформить транспортную карту, а в качестве бонуса подарят бесплатные спиннеры с логотипом сайта.

«Предоставление документов на бумаге — излишество для XXI века.

Сейчас для оказания услуги чаще нужны не сами документы, а сведения из них. На сайте госуслуг достаточно зайти в личный кабинет, заполнить необходимые данные и через некоторое время получить документ или услугу. При этом список услуг постоянно пополняется», — рассказал директор многофункционального центра в Тюменской области Александр Нагибин.

Помимо ТИУ, в 14.00 акция повторится у Государственного аграрного университета Северного Зауралья (ул. Республики, 7) и в 15.00 у строительного института ТИУ (ул. Луначарского, 2).

По данным СМИ, сейчас самым большим считается спиннер из Британии, его диаметр — 3,3 метра.

Неудобно на сайте? Читайте самое интересное в Telegram и самое полезное в Vk.

Последние новости

Вслух.ру

30 апреля, 20:48

В апреле два музея в Тобольске отмечают дни рождения

Здесь трудится несколько поколений увлеченных, знающих сотрудников.

#музей

#Тобольск

#день рождения

#коллекция

#Тюменская область

Вслух. ру

30 апреля, 19:34

Тюменский ветеринар рассказала об особенностях линьки у собак

У четвероногих друзей, живущих в домах и квартирах, может случиться внеурочная линька.

#собака

#ветеринар

#советы

#новости Тюмени

#животные

Вслух.ру

30 апреля, 18:48

70 тюменцев отправятся на форум «Утро» в Челябинск

Подать заявку нужно до 9 мая.

#форум

#челябинск

#урал

#УФО

#молодежь

#гранты

#новости Тюмени

Вслух.ру

30 апреля, 17:03

Сдать 3-НДФЛ: в Тюменской области заканчивается декларационная кампания по доходам за 2022 год

В каких случаях нужно отчитаться о доходах.

#УФНС

#налоги

#налоговая служба

#декларации

#Тюменская область

#новости Тюмени

Вслух.ру

30 апреля, 16:49

Агроном поделилась секретами посадки, выращивания, сбора и хранения лука

Лук любит воду, поэтому в течение сезона нужен хороший полив.

#лук

#посадка

#растения

#агроном

#советы

#огород

#новости Тюмени

Тюменский шанс Михаила Пришвина

О чём рассказывают старинные часы Тюмени

Этот роскошный спиннер устанавливает рекорды по самому длинному вращению

Цифровая культура

Инновации

Твоя рука справится с этим?

Смотреть Далее

Идрис Эльба и Холли Бейли продвигают гендерное равенство в новой кампании Gucci 3:21

Посмотрите, как этот ребенок произносит смехотворно сложное слово, чтобы выиграть Национальную орфографическую пчелу.

Мужчина ныряет головой вперед через гигантский воздушный шар в великолепной замедленной съемке

Джулия Луи-Дрейфус доблестно проходит через «Горячих»

Японская подшипниковая компания NSK(opens in a new tab) создала самый продолжительный спиннер(opens in a new tab) с продолжительностью работы 12 минут и более.

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

Продюсер видео


Напугайте подростков Хокинса с помощью мета-квеста.

Шеннон Коннеллан


Злые сапфики? Запишите меня.

Ясмин Хамаде



Основатель и генеральный директор Мэгги Граут основала Thinking Huts, когда ей было 15 лет.

Эммет Смит


«Все начали рыдать.»

Сэм Хейсом


Куртка Fog-X трансформируется в станцию, производящую питьевую воду.

Видео Mashable


Теперь вы можете использовать дроны для захвата труднодоступных мест или возвышенностей

Автор Mashable Video


Судя по всему, у роботов тоже могут быть фобии.

Автор Mashable Video


The Romotow придает новый смысл выражению «дом там, где сердце».

Автор Mashable Video


Пять новых серий. Бесконечные новые вопросы.

Белен Эдвардс


Пора отсеять еще немного порчи.

Сэм Хейсом

Этот информационный бюллетень может содержать рекламу, предложения или партнерские ссылки. Подписка на информационный бюллетень означает ваше согласие с нашими Условиями использования(opens in a new tab) и Политикой конфиденциальности(opens in a new tab). Вы можете отказаться от подписки на информационные бюллетени в любое время.

L5 Подключенный велосипед SPIN® — Spinning®

  • 5
    Отличный велосипед по цене

    Опубликовано Sparkler 12 июля 2021 г.

    Я сертифицированный инструктор Spin®. Тренажерный зал одолжил мне велосипед для использования во время пандемии. Они хотели вернуть его в прошлом месяце. Я вышел в интернет здесь, чтобы проверить мои варианты. Этот велосипед находится в моем ценовом диапазоне. Я привык к более тяжелому коммерческому велосипеду, но этот мне нравится. При вращении педалей он немного шумнее, чем коммерческий велосипед. Он чувствует себя очень крепким подо мной. Мне нравится настольное крепление. Я очень доволен покупкой этой модели.

  • 5
    Подключенный спинбайк L5

    Опубликовано Джилл 24 июня 2021 г.

    Этот велосипед легко собрать, и это отличный велосипед. Я катаюсь уже десять лет, и это отличный домашний велосипед.

  • 4
    Отличный велосипед за такую ​​цену!

    Размещено Ханной 6 мая 2021 г.

    Дизайн велосипеда эстетичен. Сборка простая, все получилось с первого раза. Держатель планшета выглядит действительно красиво и надежно! Я получил его в качестве подарка на день рождения для моего мужа, и он любит его. Моя единственная жалоба, и почему я не оценил его на 5 звезд, заключается в том, что сиденье и руль немного раскачиваются, когда вы едете. Мы позаботились о том, чтобы снова все затянуть, и проблема все еще существует.

    Колебание не так уж сильно, и мы все еще чувствуем себя в безопасности — мы просто хотим, чтобы оно вообще не колебалось. В целом отличный мотоцикл!

  • 5
    Сделка на колесах

    Опубликовано Рэйчел 26 апреля 2021 г.

    L5 является абсолютной единицей. Доставка была быстрой, а сборка довольно простой. Я мало что знаю о спиннингах, будучи новичком, но велосипеды кажутся тихими и выполняют свою работу. Все в нем удобно для пользователя. Не могу дождаться еще многих поездок!

  • 5
    Велосипед

    Опубликовано Jana Dangerfield 5 апреля 2021 г.

    Мне это нравится, у меня был старый велосипед Spin, и я перешел на этот, и я определенно вижу разницу.

  • 5
    Л5

    Опубликовано Кортни-Эрин Лоури 8 февраля 2021 г.

    Люблю свой спиннинг! Я езжу на нем каждое утро и очень счастлив, что он у меня есть!

  • 5
    Велосипед L5 Покупка

    Опубликовано Лорой Бек 1 февраля 2021 г.

    Как сертифицированный инструктор Spin, я очень люблю этот велосипед за то, что он отрабатывает и отрабатывает мои профили езды. Мне нравится, что это хорошо сделанный базовый велосипед с клипсами SPD. Идеальное дополнение к моему домашнему спортзалу по супер разумной цене!

  • 5
    Спиннер L5

    Опубликовано Аланом Джексоном 1 февраля 2021 г.

    В течение девяти лет я профессионально занимался спиннером на коммерческом спиннере в фитнес-центре. пока все не закрылось в марте прошлого года. Не видя конца в сайте, я, наконец, решил вложиться в домашний велосипед. Я очень доволен SPINNER L5. Конструкция и отделка очень высокого качества, все детали идеально подходят друг к другу. Самое главное, езда такая же, как у коммерческой модели, и она очень тихая. Видеоролики tv.spinning дополняют картину, чтобы получить отличную тренировку на велосипеде.

About the Author

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Related Posts