Cómo analizar la programación de subprocesos

Se deben considerar algunos aspectos para determinar si los subprocesos del proceso 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 de núcleo de CPU

Multisubproceso

Muchos juegos y motores de juegos usan varios subprocesos 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 la lógica de juego, un subproceso de renderización para preparar y enviar objetos que se dibujarán, y los subprocesos de trabajo para otras subtareas, como animaciones o audio.

Recomendamos que en paralelo los subprocesos aprovechen las mejoras de rendimiento que ofrecen. Un ejemplo de esto es una situación en la que el juego y los subprocesos 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 reducir los tiempos de CPU y, por lo tanto, podría reducir las velocidades de fotogramas.

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

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

Puedes investigar el comportamiento del subproceso de CPU en Uso de la CPU. Para ello, habilita la CPU en la configuración del perfil cuando realizas un seguimiento. Si acercas una sección del seguimiento a menos de 200 ms, podrás 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 los del juego y el de renderización, deben ejecutarse en los núcleos grandes de alto rendimiento, mientras que otros procesos y subprocesos de trabajo pueden programarse en núcleos más pequeños.

Juego con subprocesos principal y de renderización que se ejecutan principalmente en los núcleos grandes (CPU 6-7), que se muestra en azul claro
Figura 2: Juego con subprocesos principal y de renderización que se ejecutan principalmente en los núcleos grandes (CPU 6-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 de procesamiento 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 están vinculados correctamente. Esos cambios de núcleo generan cierta sobrecarga por el cambio de contexto y la pérdida de estado con la caché o los registros de un núcleo, lo que genera un aumento en la longitud del marco de la CPU.

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