Cómo analizar la programación de subprocesos

Hay algunos aspectos que debes considerar para determinar si los subprocesos del proceso de tu juego se usan de manera adecuada y están programados para obtener el mejor rendimiento.

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

Multisubproceso

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

Recomendamos paralelizar subprocesos para aprovechar las mejoras de rendimiento del multiprocesamiento. Un ejemplo de esto es una situación en la que los subprocesos del juego y de renderización se ejecutan de forma parcial o total de forma 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, velocidades de fotogramas más altas.

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

Afinidad de núcleos de CPU

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

  • Si los subprocesos de tu juego se ejecutan en el núcleo más adecuado para su carga de trabajo
  • Si los subprocesos de tu juego cambian entre núcleos 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 varios núcleos ofrecen el máximo rendimiento, pero consumen más energía. A veces, se denominan núcleos “grandes”.
  • Otros núcleos tienen un rendimiento máximo menor, pero ahorran más energía. A veces, estos se denominan “pequeños” núcleos.
  • De manera opcional, uno o más núcleos ofrecen un equilibrio entre rendimiento y potencia. A veces, se denominan núcleos del “medio”.

Puedes investigar el comportamiento de los subprocesos de la CPU en Uso de la CPU. Para ello, habilita CPU en la configuración del perfil cuando realices un seguimiento. Si acercas una sección del registro <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, CPU "0" a "3"), mientras que los más grandes corresponden a índices más altos (por ejemplo, CPU "6" a "7") y los núcleos medios, si están presentes, ocuparán índices intermedios (por ejemplo, CPU "5" a "6"). Esto es por convención común, pero no es una garantía.

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

Juego con subproceso principal y de renderización que se ejecuta principalmente en núcleos grandes (CPU 6-7), que se muestra en celeste
Figura 2: Juego con subproceso principal y de renderización que se ejecuta principalmente en núcleos grandes (CPU 6 a 7), que se muestra en celeste

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

El juego con el subproceso principal (Thread-7) y el de renderización (Thread-8) que alternan entre núcleos (se muestra en morado)
Figura 3: Juego con subproceso principal (Thread-7) y de renderización (Thread-8) que alterna entre núcleos (se muestra en púrpura)

Configurar la afinidad de CPU para un subproceso le indica al sistema que la programe en un núcleo determinado cuando el juego esté en primer plano. Hay varios factores que debes considerar cuando hagas esto:

  • El software de la plataforma no puede ajustar de forma dinámica la ubicación de las tareas para los factores del entorno de ejecución, como la carga y la limitación térmica.
  • Las pruebas de rendimiento en diferentes dispositivos pueden generar características de rendimiento muy diferentes, en especial si los dispositivos varían considerablemente según el precio o la fecha de lanzamiento.

    Un dispositivo más nuevo o más costoso puede ejecutar una carga de trabajo determinada de manera cómoda en un núcleo pequeño, pero un dispositivo más antiguo o más asequible puede requerir un núcleo más grande para cumplir con los plazos de esa misma carga de trabajo.

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

Por estos motivos, se recomienda evitar la configuración manual de afinidades de CPU.