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

É preciso considerar alguns pontos para determinar se as linhas de execução do processo do jogo estão sendo utilizadas e programadas corretamente para ter o melhor desempenho.

  • Frame Pacing
  • Uso de várias linhas de execuçã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 jogos usam a multissegmentaçã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 que serão desenhados e linhas de execução de worker para outras subtarefas, como animações ou áudio.

Recomendamos carregar as 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 de renderização estão sendo executadas parcial ou totalmente simultaneamente em núcleos diferentes. Isso nem sempre será possível, como em casos com dependências de dados compartilhadas. No entanto, quando possível, isso pode resultar em tempos de CPU mais baixos e, portanto, potencialmente mais frame rates.

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

Afinidade do núcleo da CPU

Um fator que afeta significativamente o desempenho das cargas de trabalho da CPU é a forma como elas são programadas nos núcleos. Ela pode ser dividida em dois componentes:

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

Você pode investigar o comportamento da linha de execução da CPU em Uso da CPU ativando a CPU na configuração do perfil ao fazer um trace. Ao aumentar o zoom em uma seção do rastro menor que 200 ms, é possível visualizar 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 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 do jogo e de renderização, devem ser executadas nos núcleos grandes de alto desempenho, enquanto outras linhas de execução de processos e de trabalho podem ser programadas em núcleos menores.

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

Além disso, observe se as linhas de execução do jogo alternam entre os núcleos com frequência, se a linha de execução principal e a de renderização mudam em um único frame de CPU ou entre dois frames de CPU consecutivos. Esse comportamento da CPU provavelmente é um indicador de que as linhas de execução do jogo não estão afinizadas corretamente. Essas chaves de núcleo geram sobrecarga da chave de contexto e a perda de estado dos registros/caches de um núcleo, resultando em um aumento no comprimento do frame da CPU.

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