Cómo analizar la programación de subprocesos

Hay algunas cosas que debes tener en cuenta para determinar si los subprocesos de tu juego se utilizan y programan de forma adecuada para obtener el mejor rendimiento.

  • Frame Pacing
  • Subprocesos múltiples y paralelización de subprocesos
  • Afinidad del núcleo de CPU

Multiprocesamiento

Muchos juegos y motores de juegos usan subprocesos múltiples para dividir el trabajo de la CPU en tareas lógicas, que se pueden ejecutar de forma algo independiente. Una configuración típica es un subproceso de juego para la entrada y la lógica del juego, un subproceso de renderización para preparar y enviar objetos para que se dibujen, y subprocesos de trabajo para otras subtareas, como animaciones o audio.

Recomendamos paralelizar los subprocesos para aprovechar las mejoras de rendimiento del procesamiento de subprocesos múltiples. Un ejemplo de esto es una situación en la que los subprocesos de renderización y del juego se ejecutan de forma parcial o totalmente simultánea en diferentes núcleos. Esto no siempre será posible, como en los casos con dependencias de datos compartidas. Sin embargo, cuando sea posible, esto puede generar tiempos de CPU más bajos y, por lo tanto, potencialmente, velocidades de fotogramas más altas.

Juego con un subproceso principal y de renderización bien paralelizados, así como un subproceso de trabajador y un subproceso de audio
Figura 1: Juego con subprocesos de renderización y principal bien paralelos, así como un subproceso de trabajo y un subproceso de audio

Afinidad del núcleo de CPU

Un factor que afecta significativamente el rendimiento de tus cargas de trabajo de CPU es la forma en que se programan en los núcleos. Esto se puede dividir en dos componentes:

  • Si los subprocesos del juego se ejecutan en el núcleo más adecuado para su carga de trabajo
  • Si los subprocesos del juego cambian de núcleo con frecuencia

Los dispositivos modernos suelen usar una arquitectura llamada computación heterogénea, en la que los núcleos tienen diferentes niveles de rendimiento:

  • Uno o algunos núcleos ofrecen un rendimiento máximo superior, pero consumen más energía. A veces, se los denomina núcleos "grandes".
  • Otros núcleos tienen un rendimiento máximo más bajo, pero son más eficientes en cuanto al consumo de energía. A veces, se los denomina núcleos "pequeños".
  • Opcional: Uno o más núcleos ofrecen un equilibrio entre rendimiento y potencia. A veces, se los denomina núcleos "intermedios".

Puedes investigar el comportamiento de los subprocesos de la CPU en Uso de CPU. Para ello, habilita la opción CPU en la configuración del perfil cuando tomes un registro. Si acercas el zoom a una sección de tu registro de menos de 200 ms, puedes ver los procesos individuales que se ejecutan en los núcleos de la CPU de tu dispositivo. Por lo general, los núcleos más pequeños corresponden a índices más pequeños (por ejemplo, las CPU "0" a "3"), mientras que los núcleos más grandes corresponden a índices más altos (por ejemplo, las CPU "6" y "7"), y los núcleos intermedios, si están presentes, ocuparán índices intermedios (por ejemplo, las CPU "5" y "6"). Esto se hace por convención, pero no es una garantía.

Si observas que ciertos subprocesos se programan en CPUs que no satisfacen sus necesidades de rendimiento o energía, considera establecer manualmente la afinidad de CPU para esos subprocesos.

Juego con subprocesos principal y de renderización que se ejecutan principalmente en los núcleos grandes (CPU 6-7), que se muestran en azul claro
Figura 2: Juego con subprocesos principales y de renderización que se ejecutan principalmente en los núcleos grandes (CPU 6-7), que se muestran en azul claro

También puedes observar si tus subprocesos cambian entre núcleos. Estos cambios de núcleo generan una sobrecarga debido al cambio de contexto y a la pérdida de estado con la caché o los registros de un núcleo.

Juego con subproceso principal (subproceso 7) y subproceso de renderización (subproceso 8) que cambian entre núcleos, que se muestran en color púrpura
Figura 3: Juego con subproceso principal (subproceso 7) y subproceso de renderización (subproceso 8) que cambian entre núcleos, que se muestran en color púrpura

Establecer la afinidad de la CPU para un subproceso indica al sistema que lo programe en el núcleo determinado cuando el juego esté en primer plano. Hay varios factores que debes tener en cuenta cuando lo hagas:

  • El software de la plataforma no puede ajustar de forma dinámica la ubicación de las tareas según factores de tiempo de ejecución, como la carga y la regulación térmica.
  • Las pruebas de rendimiento en diferentes dispositivos pueden arrojar características de rendimiento muy diferentes, especialmente si los dispositivos varían considerablemente en cuanto a precio o fecha de lanzamiento.

    Un dispositivo más nuevo o más caro podría ejecutar una carga de trabajo determinada sin problemas en un núcleo pequeño, pero un dispositivo más antiguo o más económico podría requerir un núcleo más grande para cumplir con los plazos de esa misma carga de trabajo.

  • Si fuerzas las afinidades a los núcleos grandes, es posible que aumentes innecesariamente el consumo de batería y la carga térmica.

Por estos motivos, en general, es mejor evitar configurar manualmente las afinidades de la CPU.