RenderingNG

Listo para la nueva generación de contenido web

Chris Harrelson
Chris Harrelson

RenderingNG es una arquitectura de renderización de nueva generación que tiene un rendimiento superior al anterior. RenderingNG se compiló a lo largo de más de ocho años y representa el trabajo colectivo de muchos desarrolladores dedicados de Chromium. Permite desbloquear un gran potencial para el contenido web rápido, fluido, confiable, interactivo y responsivo.

Boceto de los diferentes elementos de RenderingNG
RenderingNG

Aquí, verás lo que creamos, por qué lo hicimos y cómo funciona.

Objetivo North Star

El objetivo norteamericano que motiva a RenderingNG es que la implementación del motor del navegador y la riqueza de sus APIs de renderización no deben ser un factor limitante de la UX en la Web.

No tienes que preocuparte por que los errores del navegador hagan que las funciones no sean confiables o afecten la renderización de tu sitio.

No debería haber acantilados misteriosos. Además, no deberías tener que ocuparte de las funciones integradas que faltan.

Simplemente debería funcionar.

RenderizarNG es un gran paso hacia esta meta. Antes de RenderingNG, podíamos agregar (y lo hicimos) funciones de renderización y mejorar el rendimiento, pero nos costó lograr que esas funciones fueran confiables para los desarrolladores, y había muchos obstáculos en el rendimiento. Ahora tenemos una arquitectura que resuelve de forma sistemática muchos de esos problemas y desbloquea funciones avanzadas que antes no se consideraban posibles. Por ejemplo:

  • Tiene funciones principales sólidas en diferentes combinaciones de plataforma, dispositivo y sistema operativo.
  • Tiene un rendimiento predecible y confiable.
  • Maximiza el uso de capacidades de hardware (núcleos, GPU, resolución de pantalla, frecuencias de actualización, APIs de trama de bajo nivel).
  • Solo realiza el trabajo necesario para mostrar contenido visible.
  • Incluye compatibilidad integrada con patrones comunes de diseño visual, animación e interacción.
  • Proporciona APIs para desarrolladores para administrar fácilmente los costos de renderización.
  • Proporciona puntos de extensión de canalización de renderización para complementos para desarrolladores.
  • Optimiza todo el contenido: HTML, CSS, lienzo 2D, lienzo 3D, imágenes, videos y fuentes.

Comparación con otros motores de renderización del navegador

Gecko y Webkit también implementaron la mayoría de las características arquitectónicas descritas en estas entradas de blog y, en algunos casos, incluso las agregaron antes de Chromium.

Cualquier navegador que se vuelva más rápido y confiable es motivo de celebración y tiene un impacto real. El objetivo final es avanzar en el modelo de referencia para todos los navegadores, de modo que los desarrolladores puedan confiar en él.

La pirámide del éxito

Mi filosofía es que el éxito es el resultado de primero lograr la confiabilidad, luego, el rendimiento escalable y, por último, la extensibilidad.

Pirámide con etiquetas
Confiabilidad en la base, rendimiento en el medio

Al igual que en una pirámide de la vida real, cada nivel proporciona una base necesaria para el nivel superior.

Confiabilidad

Boceto en el que se muestra cómo se pueden agregar funciones de RenderingNG sin un gran aumento en la frustración

Si las experiencias del usuario enriquecidas y complejas fueran posibles, lo primero que necesitamos es una plataforma sólida. Las funciones principales y los fundamentos deben funcionar correctamente y seguir funcionando con el tiempo. Y es igual de importante que esos atributos se compongan bien y no tengan comportamientos extraños en los casos extremos ni errores.

El boceto muestra la naturaleza circular del proceso de agregar atributos, obtener retroalimentación y mejorar la confiabilidad

Por este motivo, la confiabilidad es la parte más importante de RenderingNG. La confiabilidad es el resultado de buenas pruebas, ciclos de reacción de calidad, métricas y patrones de diseño de software.

Para dar una idea de lo importante que es la confiabilidad, pasamos la mayoría de los últimos ocho años. En primer lugar, desarrollamos un conocimiento profundo del sistema: aprendimos de los informes de errores donde se encontraban los puntos débiles y los solucionamos, iniciando pruebas integrales y comprendiendo las necesidades de rendimiento de los sitios y las limitaciones del rendimiento de Chromium. Luego, diseñamos e implementamos de manera gradual y cuidadosa e implementamos patrones de diseño clave y estructuras de datos. Solo entonces estábamos listos para agregar primitivas de nueva generación para el diseño responsivo, la escalabilidad y la personalización de la renderización.

Gráfico de bocetos que muestra la mejora de la confiabilidad, el rendimiento y la extensibilidad con el tiempo

Sin embargo, esto no quiere decir que no se haya mejorado nada en Chromium durante ese período. De hecho, ocurre lo contrario. Esos años vieron un aumento constante y sostenido en la confiabilidad y el rendimiento a medida que refactorizamos e implementamos cada mejora paso a paso.

Pruebas y métricas

En los últimos 8 años, agregamos decenas de miles de pruebas de integración, rendimiento y unidad. Además, desarrollamos métricas integrales que miden muchos aspectos del comportamiento de la renderización de Chromium en pruebas locales, comparativas de rendimiento y en entornos reales en sitios reales, con usuarios y dispositivos reales.

Sin embargo, independientemente de lo bueno que sea RenderingNG (o, en realidad, el motor de renderización de otro navegador), no será fácil desarrollar contenido para la Web si existen muchos errores o diferencias de comportamiento entre los navegadores. Para solucionar este problema, también maximizamos el uso de las pruebas de la plataforma web. Cada una de estas pruebas verifica un patrón de uso de la plataforma web que todos los navegadores deben aprobar. También supervisamos de cerca las métricas para aprobar más pruebas con el tiempo y aumentar la compatibilidad principal.

Las pruebas de la plataforma web son un esfuerzo colaborativo. Por ejemplo, los ingenieros de Chromium agregaron solo alrededor del 10% del total de pruebas WPT para las funciones de CSS; otros proveedores de navegadores, colaboradores independientes y autores de las especificaciones contribuyen al resto. Se necesita toda una comunidad para construir la red interoperable.

Pruebas que pasan por distintos motores
A partir de wpt.fyi/compat2021, se está midiendo la tasa de aprobación de WPT para las funciones principales.

Buenos patrones de diseño de software

La entrega confiable de software de calidad es, a su vez, mucho más fácil si el código es fácil de entender y está diseñado de manera que minimice la probabilidad de errores. Tendremos más que hablar sobre el diseño del software de RenderingNG en las próximas entradas del blog.

Rendimiento escalable

Lograr un gran rendimiento, en las dimensiones de velocidad, memoria y uso de energía, es el siguiente aspecto más importante de RenderingNG. Queremos que las interacciones con todos los sitios web sean fluidas y responsivas, pero que no sacrifiquen la estabilidad del dispositivo.

Pero no solo queremos rendimiento, sino también escalable, una arquitectura que funcione bien de manera confiable en máquinas de gama baja y alta, y en todas las plataformas de SO. A esto lo llamo aumentar la escala, aprovechar todo lo que el dispositivo de hardware puede lograr y reducir la escala verticalmente, lo que maximiza la eficiencia y reduce la demanda en el sistema cuando sea necesario.

Para lograrlo, tuvimos que aprovechar al máximo el almacenamiento en caché, el aislamiento del rendimiento y la aceleración de hardware de la GPU. Analicemos cada uno a la vez. Para ser concreto, pensemos en cómo cada una de ellas contribuye al rendimiento de una interacción extremadamente importante en las páginas web: el desplazamiento.

Almacenar en caché

En una plataforma de IU interactiva y dinámica, como la Web, el almacenamiento en caché es la forma más importante de mejorar drásticamente el rendimiento. El tipo más conocido de almacenamiento en caché en un navegador es la caché HTTP, pero el procesamiento también tiene muchas cachés. La caché más importante para el desplazamiento son las texturas de la GPU y las listas de visualización almacenadas en caché, que permiten que el desplazamiento sea extremadamente rápido y, al mismo tiempo, minimiza el agotamiento de la batería y funciona bien en una variedad de dispositivos.

El almacenamiento en caché mejora la duración de batería y la velocidad de fotogramas de la animación para el desplazamiento, pero lo más importante es que desbloquea el aislamiento de rendimiento del subproceso principal.

Aislamiento de rendimiento

En las computadoras de escritorio modernas, nunca tendrás que preocuparte de que las aplicaciones en segundo plano retrasen la de tu trabajo. Esto se debe a la multitarea preventiva, que, a su vez, es una forma de aislamiento del rendimiento: asegurarse de que las tareas independientes no se ralenticen entre sí.

En la Web, el mejor ejemplo de aislamiento de rendimiento es el desplazamiento. Incluso en sitios web con mucho JavaScript lento, el desplazamiento puede ser muy fluido, ya que se ejecuta en un subproceso diferente que no depende de JavaScript ni del subproceso de diseño. Nos esforzamos mucho en RenderingNG para asegurarnos de que todos los desplazamientos posibles se agrupen en subprocesos, a través del almacenamiento en caché que va mucho más allá de una lista de visualización a situaciones más complejas. Algunos ejemplos incluyen código para representar elementos de posición fija y fija, objetos de escucha de eventos pasivos y renderización de texto de alta calidad.

Sketch muestra que, con RenderingNG, el rendimiento se mantiene sólido incluso cuando JavaScript es muy lento.

Aceleración de GPU

Una GPU agiliza mucho la generación de píxeles y el dibujo en la pantalla. En muchos casos, cada píxel se puede dibujar en paralelo con cada uno de los píxeles, lo que genera un gran aumento de velocidad. Un componente clave de RenderingNG es la trama de GPU y dibuja en todas partes. Esto usa la GPU en todas las plataformas y dispositivos para acelerar la renderización y la animación del contenido web. Esto es muy importante en dispositivos de gama baja o de gama alta, que suelen tener una GPU mucho más capaz que otras partes del dispositivo.

Sketch muestra que, con RenderingNG, el rendimiento no se degrada tanto.

Extensibilidad: Las herramientas adecuadas para el trabajo

Una vez que tengamos la confiabilidad y el rendimiento escalable, podremos compilar con una serie de herramientas que ayuden a los desarrolladores a extender las partes integradas de HTML, CSS y Canvas, y de maneras en las que no se sacrifique el rendimiento ni la confiabilidad.

Esto incluye las APIs integradas y expuestas de JavaScript para casos de uso avanzados de diseño responsivo, renderización progresiva, fluidez y capacidad de respuesta, y renderización en subprocesos.

Las siguientes APIs de Web abierta, impulsadas por Chromium, se pudieron implementar mediante RenderingNG, y anteriormente se consideraron inviables.

Todos se desarrollaron con especificaciones abiertas y colaboración con socios web abiertos: ingenieros de otros navegadores, expertos y desarrolladores web. En entradas de blog posteriores, profundizaremos en cada una de ellas y explicaremos cómo RenderingNG los hace posibles.

  • content-visibility: Permite que los sitios eviten fácilmente el trabajo de renderización del contenido fuera de pantalla y el procesamiento de la caché para las vistas de aplicaciones de una sola página que no se muestran actualmente.
  • OffscreenCanvas: Permite que el renderizado de lienzo (tanto la API de 2D Canvas como WebGL) se ejecute en su propio subproceso y, así, obtener un rendimiento excelente de manera confiable. Este proyecto también es otro hito importante para la Web: es la primera API web que permite que JavaScript (o WebAssembly) renderice un único documento de página web a partir de varios subprocesos.
  • Consultas de contenedores: Permiten que un solo componente se distribuya de manera responsiva, lo que desbloquea un universo entero de componentes listos para usar (actualmente, una implementación experimental).
  • Aislamiento de origen: Permite que los sitios tengan un aislamiento mayor de rendimiento entre iframes.
  • worklets de pintura fuera del subproceso principal: Proporciona a los desarrolladores una forma de extender la forma en que se pintan los elementos, con código que se ejecuta en el subproceso del compositor.

Además de las APIs web explícitas, RenderingNG nos permitió publicar varias "funciones automáticas" muy significativas que benefician a todos los sitios:

  • Aislamiento de sitios: Coloca iframes de origen cruzado en diferentes procesos de CPU para mejorar el aislamiento de seguridad y rendimiento.
  • Vulkan, D3D12 y Metal: Aprovecha las APIs de nivel inferior que usan las GPU de manera más eficiente que OpenGL.
  • Más animaciones compuestas: SVG, color de fondo.

Entre las próximas funciones adicionales que RenderingNG desbloqueará, que nos entusiasman se incluyen las siguientes:

Proyectos clave que componen RenderingNG

A continuación, se incluye una lista de proyectos clave dentro de RenderingNG.

CompositeAfterPaint

CompositeAfterPaint desenreda la composición del estilo, el diseño y la pintura, lo que permite una confiabilidad mejorada y un rendimiento predecible, una mayor capacidad de procesamiento y un uso menor de memoria sin sacrificar el rendimiento.

Año Progreso
2015 Envía listas de visualización.
2017 Envía una invalidación nueva.
2018 Árboles de propiedad de envío parte 1.
2019 Árboles de propiedad de envío parte 2.
2021 Se completó el envío del proyecto.

LayoutNG

Una reescritura inicial de todos los algoritmos de diseño para mejorar la confiabilidad y el rendimiento más predecibles

Obtén más información sobre LayoutNG.

Año Progreso
2019 Flujo de bloque de envío.
2020 Envío flexible y editando
2021 Envía todo lo demás.

BlinkNG

Refactorizamos y limpiamos el motor de renderización de Blink en fases de canalización separadas de forma clara. Esto permite un mejor almacenamiento en caché, mayor confiabilidad y funciones de renderización reentrante o retrasada, como la visibilidad del contenido y las consultas de contenedor.

Aceleración de GPU en todas partes

La aceleración de GPU proporciona una aceleración enorme para la mayoría del contenido, ya que cada píxel se puede procesar en paralelo. También es un método eficaz para mejorar el rendimiento en dispositivos de gama baja, que todavía tienen una GPU.

Año Progreso
2014 Compatibilidad con Canvas Se envían en contenido que se debe habilitar en Android.
2016 Enviar en Mac.
2017 La GPU se usa en más del 60% de las vistas de páginas de Android.
2018 Envíala en Windows, ChromeOS y Android Go.
2019 Rasterización por subprocesos de GPU.
2020 Envía el contenido restante de Android.

Desplazamiento de subprocesos, animaciones y decodificación

Es un esfuerzo a largo plazo para quitar del subproceso principal todas las animaciones de desplazamiento, las animaciones que no induzcan el diseño y la decodificación de imágenes. Está en curso.

Año Progreso
2011 Compatibilidad inicial con el desplazamiento en subprocesos y la animación.
2015 Compresión de capas.
2016 Desplazamiento universal de desbordamiento.
2017 La imagen se decodifica en el subproceso del compositor.
2018 Animaciones de imágenes en un subproceso del compositor.
2020 Siempre compuesto en posición fija.
2021 Animaciones de transformación de porcentaje, animaciones SVG.

visualización

Un proceso de generación y trama centralizado para Chromium que aumenta la capacidad de procesamiento, optimiza la memoria y permite el uso óptimo de las capacidades del hardware. Ofrece otros beneficios menos visibles para los desarrolladores web, pero muy visibles para los usuarios, como el desbloqueo del aislamiento de sitios y la separación de la canalización de procesamiento de la renderización de la IU del navegador.

Año Progreso
2018 OOP-R se envía en Android, Mac y Windows.
2019 OOP-D enviado. OOP-R se envía a todas partes (excepto Canvas). SkiaRenderer se envió en Linux.
2020 SkiaRenderer se envió en Windows y Android. Vulkan se envió en Android.
2021 SkiaRenderer se envió en Mac (y ChromeOS próximamente).

Definiciones de términos en el gráfico anterior:

OOP‐D
El compositor de pantalla está fuera de proceso. La composición de pantalla es el mismo tipo de actividad que un compositor de SO. Sin proceso, significa hacerlo en el proceso de Viz en lugar del proceso de renderización de la página web o de la IU del navegador.
OOP-R
Trama fuera de proceso La trama convierte listas de visualización en píxeles. Fuera del proceso significa hacerlo en el proceso de Viz en lugar del proceso de renderización de la página web.
SkiaRenderer
Es una nueva implementación del compositor de pantalla que puede admitir la ejecución en una variedad de APIs subyacentes de GPU, como Vulkan, D3D12 o Metal.

Renderización de lienzo en subproceso y acelerado

Este es el proyecto que hizo posible OffscreenCanvas.

Año Progreso
2018 Envía OffscreenCanvas.
2019 Se envía ImageBitmapRenderingContext.
2021 Enviar OOP-R.

VideoNG

VideoNG es una iniciativa a largo plazo para proporcionar una reproducción de video eficiente, confiable y de alta calidad en la Web.

Año Progreso
2014 Se introdujo un framework de renderización basado en Mojo.
2015 Se enviaron Project Butter y superposiciones de video para lograr una renderización de video más fluida.
2016 Se enviaron canalizaciones de renderización y decodificación unificadas para Android y computadoras de escritorio.
2017 Se envió la renderización del video con corrección de color y HDR.
2018 Se envió la canalización de decodificación de video basada en Mojo.
2019 Canalización de renderización de video basada en la superficie enviada
2021 Se envió compatibilidad con procesamiento de contenido protegido en 4K en ChromeOS.

Definiciones de términos en el gráfico anterior:

Mojo
Un subsistema de IPC de nueva generación para Chromium.
Superficie
Es un concepto que forma parte del diseño del proyecto de Viz.

Ilustraciones de Una Kravets.