Há algumas considerações importantes para determinar se as linhas de execução do processo do jogo são usadas e programadas adequadamente para o melhor desempenho.
- Frame Pacing
- Multithreading e paralelização de linhas de execução
- Afinidade do núcleo da CPU
Multithreading
Muitos jogos e mecanismos de jogos usam multithreading para dividir o trabalho da CPU em tarefas lógicas, que podem ser executadas de forma um pouco independente. Uma configuração típica é uma linha de execução de jogo para entrada e lógica 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 paralelizar as linhas de execução para aproveitar os ganhos de desempenho do multithreading. Um exemplo disso é um cenário em que as linhas de execução de jogo e renderização estão sendo executadas parcial ou totalmente de forma simultânea em núcleos diferentes. Isso nem sempre é possível, como em casos com dependências de dados compartilhados. No entanto, quando possível, isso pode resultar em tempos de CPU mais baixos e, portanto, taxas de frames potencialmente mais altas.
Afinidade do núcleo da CPU
Um fator que afeta significativamente o desempenho das cargas de trabalho da CPU é como elas são programadas nos núcleos. Isso pode ser dividido em dois componentes:
- Se as linhas de execução do jogo estão sendo executadas no núcleo mais adequado para a carga de trabalho.
- Se as linhas de execução do jogo mudam de núcleo com frequência.
Os dispositivos modernos costumam usar uma arquitetura chamada computação heterogênea, em que os núcleos têm níveis de desempenho diferentes:
- Um ou alguns núcleos oferecem o melhor desempenho máximo, mas consomem mais energia. Às vezes, eles são chamados de núcleos "grandes".
- Outros núcleos têm desempenho máximo mais baixo, mas são mais eficientes em termos de energia. Às vezes, eles são chamados de núcleos "pequenos".
- Opcional: um ou mais núcleos oferecem um equilíbrio entre desempenho e energia. Às vezes, eles são chamados de núcleos "médios".
É possível 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 rastreamento. Ao aumentar o zoom em uma seção do rastreamento com menos de 200 ms, é possível conferir os processos individuais em execução nos núcleos da CPU do dispositivo. Normalmente, núcleos menores correspondem a índices menores (por exemplo, CPUs "0" a "3"), enquanto núcleos maiores correspondem a índices mais altos (por exemplo, CPUs "6" a "7") e núcleos médios, se presentes, ocupam índices intermediários (por exemplo, CPUs "5" a "6"). Essa é uma convenção comum, mas não é uma garantia.
Se você descobrir que determinadas linhas de execução estão sendo programadas em CPUs que não atendem às necessidades de desempenho ou energia, considere definir manualmente a afinidade da CPU para essas linhas de execução.
Também é possível observar se as linhas de execução mudam de núcleo. Essas mudanças de núcleo geram alguma sobrecarga da mudança de contexto e da perda de estado com o cache/registros de um núcleo.
A definição de afinidade da CPU para uma linha de execução instrui o sistema a programá-la no núcleo especificado quando o jogo está em primeiro plano. Há vários fatores a serem considerados ao fazer isso:
- O software da plataforma não pode ajustar dinamicamente o posicionamento de tarefas para fatores de execução, como carga e limitação térmica.
Os testes de desempenho em dispositivos diferentes podem gerar características de desempenho muito diferentes, especialmente se os dispositivos variarem consideravelmente pela faixa de preços ou pela data de lançamento.
Um dispositivo mais novo ou mais caro pode executar uma determinada carga de trabalho confortavelmente em um núcleo pequeno, mas um dispositivo mais antigo ou mais acessível pode exigir um núcleo maior para atender aos prazos da mesma carga de trabalho.
Ao forçar afinidades a núcleos grandes, você pode aumentar desnecessariamente o consumo de bateria e a carga térmica.
Por esses motivos, geralmente é melhor evitar a definição manual de afinidades da CPU.