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 los mejores núcleos para mejorar el rendimiento
  • Si los subprocesos de tu juego cambian entre núcleos con frecuencia

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 pequeños corresponden a índices más pequeños (por ejemplo, CPU 0-3), mientras que los núcleos grandes corresponden a índices más altos (por ejemplo, CPU 6-7).

Por lo general, cuando el juego está en primer plano, los subprocesos persistentes, como el de juego y el de renderización, deben ejecutarse en núcleos grandes de alto rendimiento, mientras que otros subprocesos de proceso y de trabajador se pueden programar en núcleos más pequeños.

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 de tu juego cambian entre núcleos con frecuencia, si tu subproceso principal y el de renderización cambian los núcleos dentro de un solo marco de CPU o entre dos marcos de CPU consecutivos. Es probable que este comportamiento de la CPU sea un indicador de que los subprocesos de tu juego no tienen la afinidad adecuada. 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, lo que da como resultado un aumento en la longitud del marco de la CPU.

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)