React & Nyxwell
Привет, Никc. Поигрался тут с CSS-фильтрами, и вот что за производительность – совсем не радует, особенно когда их накидываешь кучу на один элемент. Интересно, насколько сильно визуальные искажения влияют на восприятие плавности для пользователя. Может, у тебя есть какие-нибудь эксперименты или логи, как небольшие изменения в освещении влияют на реакцию браузера?
Я провёл несколько тестов с CSS blur, brightness и hue-rotate, наложив их друг на друга. Каждый дополнительный фильтр примерно в столько же раз увеличивает вычислительную нагрузку, как и количество обрабатываемых пикселей, но главное – реакция зрителя. Я фиксирую частоту мерцания крошечной красной точки в углу экрана, измеряя первую заметную задержку после применения фильтра. Когда я добавил поворот оттенка в 0.1 градуса, дрожание точки увеличилось примерно на 3 миллисекунды, а время моргания пользователя – на 5 миллисекунд. С размытием в 2 пикселя микрореакция выросла до 15 миллисекунд – всё ещё в пределах ощутимой плавности, но заметно, если ты гонишься за подкадровым таймингом. Логи у меня в обычном CSV файле – там время, стек фильтров и замедление реакции. Это игра света и времени, а не свод правил.
Вот это здравая идея, Ныксвелл. Сохранять необработанную задержку в CSV – отличный ход, можно будет загрузить в таблицу и быстро построить график для выявления выбросов. Я бы еще подключил PerformanceObserver к событиям отрисовки, чтобы получать данные о бюджете кадров вместе с твоими метриками. Так ты сможешь понять, откуда берется этот скачок в 30–40 миллисекунд – из самого фильтра или из-за сбоя композитора. Как только у тебя будут оба набора данных, попробуй перенести тяжелые фильтры на отдельный канвас, отрисуй одно изображение и проверь, уменьшится ли визуачная задержка. Следи за цифрами, и ты упредишь любые ухудшения до того, как они повлияют на пользователей.
Запишу этот параметр в цепочку логов, буду отслеживать время отрисовки текстур, а потом отправлю тяжелые фильтры на скрытый холст. Если задержка восприятия уменьшится, если я буду отображать их напрямую, а не применять в реальном времени, я пойму, что виноват композитор. Данные сохраню в том же CSV-файле, просто добавлю столбец с меткой времени отрисовки текстур, а потом построю обе кривые, чтобы понять, где совпадают пики. Если пики всё равно останутся выше 30 миллисекунд после прямого отображения, значит, я упираюсь в более глубокую проблему с визуализацией. В любом случае, данные дадут мне те фрагменты паззла, которые мне понадобятся, чтобы подстроить световые искажения, чтобы пользователь их почти не замечал.
Отличный план, Никсвелл. Следи, чтобы CSV был аккуратным, и добавь небольшой скрипт для автоматического построения графика рядом с таймлайном отрисовки. Так ты сразу увидишь, где узкое место – на фильтрации или на отрисовке. Как только добьешься порога в 30 миллисекунд, у тебя будет четкое правило, чтобы интерфейс работал плавно. Удачи!
Окей, сделаю. Напишу небольшой скрипт на Node.js, который вытащит CSV, использую D3, чтобы построить две линии рядом – задержка и время отрисовки – чтобы я мог визуально определить точку пересечения. Как только станет понятно, где 30 миллисекунд, зафиксирую это правило комментарием в коде. Головоломку с визуализацией решим до того, как кто-нибудь заметит искажение.