Cómo analizar la programación de subprocesos

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

  • Frame Pacing
  • Multisubproceso y paralelización de subprocesos
  • Afinidad del núcleo de CPU

Multisubproceso

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

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

Juego con un subproceso principal y de renderización bien paralelizados, así como un subproceso de trabajo y un subproceso de audio
Figura 1: Juego con un subproceso principal y de procesamiento bien paralelizado, así como un subproceso de trabajador 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 de tu juego se ejecutan en el núcleo más adecuado para su carga de trabajo
  • Si los subprocesos de tu 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 el máximo rendimiento, pero consumen más energía. A veces, se los llama núcleos "grandes".
  • Otros núcleos tienen un rendimiento máximo más bajo, pero son más eficientes en cuanto a la energía. A veces, se los llama núcleos "pequeños".
  • Opcionalmente, uno o más núcleos ofrecen un equilibrio entre rendimiento y energía. A veces, se los llama núcleos "medianos".

Puedes investigar el comportamiento de los subprocesos de la CPU en Uso de CPU si habilitas la CPU en la configuración del perfil cuando tomas un seguimiento. Si acercas una sección de tu seguimiento 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, CPUs "0"-"3"), mientras que los núcleos más grandes corresponden a índices más altos (por ejemplo, CPUs "6"-"7") y los núcleos medianos, si están presentes, ocuparán índices intermedios (por ejemplo, CPUs "5"-"6"). Esta es una convención comú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 configurar 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 subproceso principal y de procesamiento que se ejecuta 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 del cambio de contexto y 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 (Thread-7) y de procesamiento (Thread-8) que cambian entre núcleos, que se muestran en morado

Si configuras la afinidad de CPU para un subproceso, se le 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 para los factores de tiempo de ejecución, como la carga y la limitación térmica.
  • Las pruebas de rendimiento en diferentes dispositivos pueden producir 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 podría ejecutar una carga de trabajo determinada cómodamente 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, puedes aumentar innecesariamente el consumo de batería y la carga térmica.

Por estos motivos, por lo general, es mejor evitar configurar manualmente las afinidades de CPU.