UfoStation

Почему Paint stage не одна большая операция

В прошлый раз мы остановись на шаге Layout в Rendering Pipeline, на котором вычисляется Layout Tree, то есть положение и геометрия объектов на странице. Также напомню, что в общем виде Rendering Pipeline выглядит так:

JavaScript → Style → Layout → Paint → Compose

Следующий шаг, это отрисовка — Paint.

Браузер — приложение, и как правило использует библиотеку для вывода примитивов на экранах через вызовы операционной системы, в которой работает. И кажется, если не вдаваться в детали реализации, то вроде бы ничего сложного, нужно согласно ранее полученному Render Tree и Layout Tree понять какой набор API-вызовов будет вызван,, но посмотрите на то, как это все устроено в Rendering pipeline structure в Chromium:

Схема Rendering pipeline structure из статьи Overview of the RenderingNG architecture

Почему отрисовка это не одна (большая) операция?

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

Во-вторых, дело в безопасности! Предоставлять ресурсы всей операционной системы процессу отрисовки может быть не безопасно, а это также влияет на финальный pipeline.

Далее я попробую логически показать как совершить переход к тому, что вы видели выше (или подобию этого) из общей схемы рендеринга:

JavaScript → Style → Layout → Paint

Начну с того, что процесс отрисовки работает в песочнице, то есть доступ к ресурсам операционной системы у него ограничен, поэтому отрисовкой на экран занимается непосредственно GPU-процесс, отсюда наш Rendering Pipeline разбивается на два процесса:

Render process
Main thread: Parse (JavaScript) → Style → Layout → Paint

Viz GPU process
Main thread: Raster → Draw

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

Нашли ошибку или опечатку? Предложите исправление

← Вернуться в блог