Analisar a programação de linhas de execução

Há alguns pontos a serem considerados para determinar se as linhas de execução do processo de jogo são utilizadas e programadas de maneira adequada para ter o melhor desempenho.

  • Frame Pacing
  • Multissegmentação e carregamento em paralelo de linhas de execução
  • Afinidade do núcleo da CPU

Usar várias linhas de execução

Muitos jogos e mecanismos de jogo usam várias linhas de execução para dividir o trabalho da CPU em tarefas lógicas, que podem ser executadas de forma independente. Uma configuração típica é uma linha de execução de jogo para lógica de entrada e de jogo, uma linha de execução de renderização para preparar e enviar objetos a serem desenhados e linhas de execução de worker para outras subtarefas, como animações ou áudio.

Recomendamos carregar linhas de execução em paralelo para aproveitar os ganhos de desempenho do uso de várias linhas de execução. Um exemplo disso é um cenário em que as linhas de execução do jogo e da renderização são executadas de forma parcial ou totalmente simultânea em diferentes núcleos. Isso nem sempre será possível, por exemplo, em casos com dependências de dados compartilhadas. No entanto, quando possível, o resultado poderá ser menores tempos de CPU e, portanto, taxas de frames potencialmente mais altas.

Jogo com uma linha de execução principal e de renderização em paralelo, bem como uma linha de execução de worker e uma de áudio
Figura 1. Jogo com uma linha de execução principal e de renderização em paralelo, bem como uma linha de execução de worker e uma de áudio.

Afinidade do núcleo da CPU

Um fator que afeta significativamente o desempenho das cargas de trabalho da CPU é a programação delas nos núcleos. Ela pode ser dividida em dois componentes:

  • Se as linhas de execução do jogo estão sendo executadas nos melhores núcleos para o desempenho
  • Se as linhas de execução do jogo alternam entre núcleos com frequência

Para investigar o comportamento da linha de execução da CPU, em Uso da CPU, ative a CPU na configuração do perfil ao fazer um rastro. Ao aumentar o zoom em uma seção do rastreamento com menos de 200 ms, você pode ver os processos individuais em execução nos núcleos da CPU do dispositivo. Normalmente, núcleos pequenos correspondem a índices menores (por exemplo, CPU 0-3), enquanto os núcleos grandes correspondem a índices mais altos (por exemplo, CPU 6-7).

Geralmente, quando o jogo está em primeiro plano, linhas de execução persistentes, como as linhas de execução de jogo e de renderização, precisam ser executadas nos núcleos grandes de alto desempenho, enquanto outras linhas de execução de processos e workers podem ser programadas em núcleos menores.

Jogo em que as linhas de execução principal e de renderização são executadas principalmente nos núcleos grandes (CPU 6-7), mostradas em azul-claro.
Figura 2. Jogo com a linha de execução principal e de renderização executada principalmente nos núcleos grandes (CPU 6-7), mostrada em azul-claro

Você também pode observar se os encadeamentos do jogo alternam entre os núcleos com frequência, se o encadeamento principal e de renderização mudam de núcleo em um único frame da CPU ou entre dois frames de CPU consecutivos. Esse comportamento da CPU provavelmente é um indicador de que os encadeamentos do jogo não estão devidamente ativados. Essas chaves primárias geram sobrecarga na troca de contexto e na perda de estado com cache/registros de um núcleo, resultando em um aumento no comprimento do frame da CPU.

Jogo com as linhas de execução principal (Thread-7) e de renderização (Thread-8) que alternam entre núcleos, mostrado em roxo
Figura 3. Jogo com as linhas de execução principal (Thread-7) e de renderização (Thread-8) que alternam entre núcleos, mostrado em roxo