É normal que um jogo use 100% da CPU?

23

Acabei de implementar a manipulação de entradas multithread no meu mecanismo de jogo, em que o código que consulta o sistema operacional para coletar as entradas e os carimbos de data e hora está em um thread separado. hora do jogo lógico. Tudo funciona, mas esta configuração está usando 100% da minha CPU. Eu tenho dois núcleos, e está subindo para 100% durante a execução do meu jogo.

Eu verifiquei com outros jogos para ver se eles fazem isso também. Por exemplo, Skyrim e Doom 3 parecem estar bem com pouco mais de 60% da CPU.

É aceitável que um jogo que use entrada multiencadeada use 100% da CPU? Caso contrário, quais são alguns truques que esses jogos usam para diminuir o uso da CPU pelo thread de entrada?

The Light Spark
fonte
7
Então, o que você diz, basicamente você tem um segmento com um loop while interminável que pesquisa constantemente o sistema operacional em busca de novos eventos? while true do CheckForEvents;
Kromster diz apoio Monica
5
Se um aplicativo usar 100% do tempo da CPU, independentemente do uso e velocidade da CPU, ele poderá ser considerado um bug por direito. Você não deve usar mais tempo de CPU do que o necessário para renderizar um quadro por ciclo de atualização do monitor.
kasperd
3
@TheLightSpark O tópico da pesquisa nem dorme? Se você está constantemente fazendo loop e verificando sem dormir, provavelmente gastará muito mais tempo de CPU do que o necessário.
Luke
3
Re @Luke: Mesmo dormir apenas um milissegundo entre as pesquisas reduzirá drasticamente o uso da CPU. Há um tempo atrás, escrevi uma GUI para uma ferramenta de linha de comando que pegou um arquivo de entrada e criou um arquivo de saída aproximadamente do mesmo tamanho. Para estimar a porcentagem, li o tamanho do arquivo de saída e atualizei a barra de progresso (usando while (true)). Utilizou mais de 90% de uma CPU para fazer isso. Adicionado um Thread.Sleep(5)a isso reduziu o uso da CPU para menos de 40%. Passar para 25 milissegundos entre as pesquisas reduziu para menos de 10%.
Cole Johnson
2
@AlecTeal Acho que você não prestou atenção suficiente ao que eu disse. Renderizar gráficos melhores não é o mesmo uso, e, é claro, habilitar gráficos melhores aumentará o consumo da CPU. Mas se a mudança para uma CPU mais rápida fizer com que seu código gaste mais ciclos produzindo exatamente o mesmo resultado, seu código será defeituoso. Medir automaticamente qual a qualidade dos gráficos que pode ser renderizada com uma CPU específica é um padrão sensato. Mas você deve permitir que os usuários escolham caso estejam funcionando com bateria ou também precisem de CPU para trabalhos em segundo plano.
precisa saber é o seguinte

Respostas:

41

Sim, é normal que um jogo em tempo real tente usar 100% da CPU para executar o mais rápido e bom possível. Para que o jogador veja o máximo de quadros por segundo ou a boa simulação física ou qualquer outra coisa que seu PC possa fornecer.

No seu caso - Não, isso parece um design ineficiente, para pegar um encadeamento e fazê-lo pesquisar eventos em um loop ( while true do CheckForEvents;). Corrija-me se estiver errado, mas o SO já vota os eventos. Você deve apenas checá-los no seu thread principal uma vez a cada tick.

O loop principal do jogo deve ser rápido o suficiente para rodar a mais de 30 ticks por segundo, o que é suficiente para pesquisar comandos em muitos jogos. O jogador não verá diferença se seus comandos forem processados, por exemplo, 0-33ms depois. Por outro lado, você poderia ter usado esse núcleo extra da CPU para tarefas mais benéficas, como MU melhor IA ou física ou o que quer.

PS Conforme solicitado para esclarecer nos comentários, não tome os números acima cegamente para todos os tipos de jogos. Enquanto o jogo TBS pode precisar de apenas 1 tick por turno e o jogo RTS pode ser bom com 10 ticks por turno, outros gêneros, como o RaceSims, precisam de muito mais. E, é claro, não vincule os ticks lógicos à taxa de quadros, essas são duas coisas separadas.

Kromster diz apoio Monica
fonte
5
Gostaria de aprovar esta pergunta, mas, em seguida, vejo que você recomenda 30 ticks por segundo. IMHO (e os de muitos outros jogadores), você deve apontar para 60 ticks (e, portanto, 60 frames) por segundo. 60 FPS para muitas pessoas parece mais fluido, tem maior capacidade de resposta e tem menos probabilidade de causar um certo subconjunto de usuários com enjoo.
Nzall 25/09
4
33ms de atraso para entrada é muito perceptível ...
Synxis
1
@NateKerkhofs: Eu vim do RTS, onde 10 ticks são comuns. É um mundo amplo, vou adicionar detalhes sobre isso. Obrigado por apontar.
Kromster diz apoio Monica
1
@KromStern: Eu não posso falar totalmente por Nate, mas o terceiro parágrafo pode ser interpretado como "30 hz deve ser o seu objetivo", embora também possa ser interpretado como "30 hz é o mínimo que você pode tolerar" (que pode ser o que você quis dizer )
Sean Middleditch
1
Usar 100% da CPU é uma prática terrível. Você está atrapalhando os usuários de laptops por coisas que de forma alguma precisam de 100% da CPU. Codifique um loop de jogo adequado que possa alimentar quadros ao monitor com eficiência.
Chris Dennett
9

Um jogo com uma atualização constante da janela ativa será executado principalmente no modo de tela cheia e será o único (grande) programa da máquina gerenciada pelo sistema operacional. Portanto, é totalmente aceitável usar 100% da CPU, porque nada mais precisa disso.

No entanto , isso não significa, é claro, que você sempre deve usar 100%, independentemente do estado do jogo. A maioria dos loops de jogo usa um método sleep como um delimitador de taxa de quadros se eles terminarem de renderizar um quadro antes do limite da taxa de quadros, para não fazer com que a CPU seja usada para nada.
Provavelmente, isso é o que acontece nos seus exemplos: sua máquina é mais rápida do que o Skyrim ou o Doom 3 precisam executar, portanto, eles usam apenas o que precisam - mas tudo o que precisam.

Como o @KromSterm disse, o SO geralmente já realiza pesquisas para você, portanto, não há necessidade de fazer um loop mais rápido que o do SO. Se você tiver apenas dois núcleos, usar 100% do segundo apenas para detecção de eventos não é uma boa ideia, porque se você transferir apenas eventos para o loop principal de atualização, é muito rápido executar. Você deve tentar usar esse núcleo para uma parte do trabalho de thread principal com outro thread.

Aracthor
fonte
"use um método de suspensão" - estou certo ao pensar que isso é conhecido como um limitador de taxa de quadros?
Gusdor 25/09/2015
3
sono não é um método preciso de quadro limitativo, se o objectivo é o de quadros limite para monitorar a taxa de actualização, em seguida, o melhor é a utilização vsync suportado por hardware (ou g-sincronização da Nvidia, se disponível)
Sarge Borsch
8

Existem algumas desvantagens de tentar usar todo o tempo disponível da CPU em um PC ou jogo para celular.

Requisitos do sistema: se o jogo puder ser reproduzido no PC em que você desenvolve o jogo, ele poderá não ser jogável em um PC mais fraco, de propriedade de alguém que comprou o jogo. Limitar o uso da CPU manterá um jogo utilizável em máquinas que mais pessoas provavelmente já possuem. Se você realmente deseja saber se está limitando seu mercado, teste seus jogos para PC e os de seus concorrentes em um destacável equipado com Atom, como o Transformer Book, ou teste seus jogos para celular em um telefone Android pré-pago e barato.

Uso de energia: um laptop consome a bateria mais rapidamente quando quatro núcleos são usados ​​a 100% da frequência total do que quando, digamos, dois núcleos são usados ​​a 60% da meia frequência. Portanto, verifique se o encadeamento de polling do controlador, o encadeamento AI, o encadeamento físico e o encadeamento gráfico está bloqueado até a hora de executar novamente. Exceto em alguns gêneros muito contorcidos, como luta e ritmo, você não precisará pesquisar os controladores mais rapidamente do que cerca de 60 Hz, portanto, configure seu segmento de polling para rodar em um timer de 60 Hz.

Variabilidade física: se a física que afeta a jogabilidade for mais detalhada em máquinas mais fortes, a mesma ação do jogador terá resultados diferentes em máquinas diferentes. Isso significa que o jogador pode trapacear usando uma máquina mais forte ou mais fraca. A Arena Quake III da Id é notória por ter a taxa de quadros afetada na altura do salto . Para evitar isso, muitos jogos usam uma etapa de tempo fixo para a física. Mas isso não afeta a física desconectada da jogabilidade, como efeitos de partículas ou efeitos de tecido ou interpolação de coordenadas entre os quadros da física para renderizar o vídeo com uma taxa de quadros maior que a física. Portanto, projete sua física usando alguma variante do model-view-controller arquitetura, onde coisas essenciais (aceleração, detecção de ocorrência e similares) entram no modelo e visual candy ajustável é visualizado.

Variabilidade da IA: Se a IA for mais detalhada em máquinas mais fortes, os inimigos se comportarão de maneira diferente em máquinas diferentes. Por exemplo, em uma implementação de Go ou Chess, o oponente fica mais fraco em um PC mais fraco, e os jogadores podem trapacear jogando o jogo em um PC mais fraco ou executando processos em segundo plano, como antivírus ou transcodificação de vídeo ou atualizações do sistema operacional.

Damian Yerrick
fonte
4
+1 para uso de energia. Especialmente porque você deve considerar a indústria de celulares e tablets, onde isso é extremamente importante.
akaltar 26/09/15
1
O uso de energia também afeta o ruído, mesmo em desktops. É comum que os desktops modernos mantenham seus fãs lentos e silenciosos quando o sistema é legal. Além disso, talvez o usuário esteja codificando um vídeo (com baixa prioridade) durante a reprodução, para que não seja desperdiçado tempo de CPU disponível. Ou para os players que estão se movendo para trás, deixar mais ciclos para a codificação de vídeo é um grande negócio e permite vídeos de alta qualidade. (codificação de vídeo é uma de três vias tradeoff entre o tempo de CPU, bitrate, e qualidade, de modo mais meios de tempo CPU em tempo real codifica a uma maior qualidade ao mesmo bitrate.)
Peter Cordes
1
O uso de energia deve ser a principal consideração, todas as outras considerações secundárias, IMHO. A única coisa para a qual eu usaria 100% da CPU (se realmente ajudou!) É o material de VR.
Chris Dennett