Evita el efecto de rebote en los controladores de entrada

Los controladores de entrada son una posible causa de problemas de rendimiento en tus apps, ya que pueden bloquear la compleción de los fotogramas y dar lugar a trabajo de diseño adicional e innecesario.

Los controladores de entrada son una posible causa de problemas de rendimiento en tus apps, ya que pueden bloquear la finalización de los fotogramas y generar trabajo de diseño adicional e innecesario.

Resumen

  • Evita los controladores de entrada de larga ejecución, ya que pueden bloquear el desplazamiento.
  • No realices cambios de estilo en los controladores de entrada.
  • Evita el efecto de rebote en los controladores. Almacena los valores de los eventos y realiza cambios de estilo en la siguiente devolución de llamada requestAnimationFrame.

Evita los controladores de entrada de larga duración

En el caso más rápido posible, cuando un usuario interactúa con la página, el subproceso del compositor de la página puede tomar la entrada táctil del usuario y simplemente mover el contenido. Esto no requiere el trabajo del subproceso principal, donde se realizan JavaScript, el diseño, los estilos o la pintura.

Tiene un desplazamiento ligero, solo el compositor.

Sin embargo, si adjuntas un controlador de entrada, como touchstart, touchmove o touchend, el subproceso del compositor debe esperar a que el controlador termine de ejecutarse, ya que puedes llamar a preventDefault() y detener el desplazamiento táctil. Incluso si no llamas a preventDefault(), el compositor debe esperar. Por lo tanto, el desplazamiento del usuario se bloquea, lo que puede generar saltos y fotogramas perdidos.

Hay mucho desplazamiento; el compositor está bloqueado en JavaScript.

En resumen, debes asegurarte de que los controladores de entrada que ejecutes se ejecuten rápidamente y permitan que el compositor haga su trabajo.

Cómo evitar cambios de estilo en los controladores de entrada

Los controladores de entrada, como los que se usan para las funciones táctil y de desplazamiento, están programados para ejecutarse justo antes de cualquier devolución de llamada de requestAnimationFrame.

Si realizas un cambio visual dentro de uno de esos controladores, al comienzo de requestAnimationFrame, habrá cambios de estilo pendientes. Si luego lees las propiedades visuales al inicio de la devolución de llamada de requestAnimationFrame, como se sugiere en la sección “Evita los diseños grandes y complejos, y la hiperpaginación de diseños”, activarás un diseño sincrónico forzado.

Hay mucho desplazamiento; el compositor está bloqueado en JavaScript.

Evita el rebote en los controladores de desplazamiento

La solución para los dos problemas anteriores es la misma: siempre debes anular los cambios visuales a la siguiente devolución de llamada requestAnimationFrame:

function onScroll (evt) {

    // Store the scroll value for laterz.
    lastScrollY = window.scrollY;

    // Prevent multiple rAF callbacks.
    if (scheduledAnimationFrame)
    return;

    scheduledAnimationFrame = true;
    requestAnimationFrame(readAndUpdatePage);
}

window.addEventListener('scroll', onScroll);

Hacer esto también tiene el beneficio adicional de mantener tus controladores de entrada ligeros, lo cual es genial porque ahora no estás bloqueando cosas como el desplazamiento o la función táctil en código costoso desde el punto de vista informático.