Como devo escrever um loop do jogo principal? [fechadas]


130

Como devo escrever um loop do jogo principal? Quais são algumas das coisas que você deve fazer no ciclo do jogo e quais são as coisas que você não deve fazer no ciclo do jogo?

Eu escrevi muitos deles, mas eu nunca li sobre loops de jogos. Tenho certeza de que poderia melhorá-los consideravelmente, mas não sei como.


4
Resposta má: Que tal usar o mecanismo de alguém para fazer esse loop para você? :)
user712092

você pode perguntar ao usuário o número total de quadros que ele deseja executar e usar um loop for até n vezes a quantidade de buffers.
Uğur Gümüşhan

Respostas:


121

O loop principal do jogo lida com três tarefas principais:

  1. Obter entrada do usuário
  2. Atualize o estado do jogo
  3. Desenhe o jogo

Um loop de jogo simples apenas reúne essas três tarefas em um loop while. Isso tem alguns resultados indesejados:

  1. O jogo é executado em velocidades diferentes em computadores diferentes.
  2. CPU (pode ser desnecessariamente) vinculada a 100% de uso.
  3. Os menus "Estados do jogo" estão ausentes ou misturados ao código do jogo.
  4. O loop do jogo principal é muito longo e difícil de manter.
  5. É difícil estender o código / porta para outras plataformas.

Os loops gamed avançados solucionam os problemas listados acima. Aqui estão alguns artigos úteis:

Para um excelente exemplo de loop de jogo, dê uma olhada no jogo de demonstração do Allegro skater:

  • O código do loop do jogo está em framework.c .
  • Navegue pelo código fonte completo aqui .

Os loops de jogos geralmente fazem o mesmo tipo de trabalho para a maioria dos jogos, então eu tenho pensado em uma maneira de criar uma estrutura de jogo generalizada. É melhor escrever uma implementação de um loop de jogo e compartilhá-lo entre os jogos. Isso economiza trabalho ao criar um novo jogo, e as melhorias no loop do jogo compartilhado podem ser compartilhadas por todos os jogos (por exemplo, adicionando um contador de FPS ou recurso de captura de tela).


11
Sim, como suspeito, eu definitivamente posso fazer melhorias. Boas leituras. Além disso, obrigado por postar o código. É ótimo ver o código do jogo real com essas coisas.
hokiecsgrad

11
A CPU deve ficar travada com 100% de uso (ou mais como 50% se você tiver pelo menos 2 núcleos). Pense nisso. Como você vai obter uma física de ponta, gráficos impressionantes, se estiver sentado lá dizendo para si mesmo: "Ah, mas eu não quero usar toda a CPU". Sim, você deve usar 100% da CPU, se possível (isso significa multithreading nos computadores atuais, por isso é muito difícil usar 100% dos 4 núcleos o tempo todo). Tire o máximo proveito da máquina em que você está executando.
bobobobo

5
Permita-me acrescentar: Para programas da área de trabalho . Em um dispositivo portátil, você estará consumindo muito mais bateria, por isso se preocupará com o uso de 100%.
bobobobo

11
@ user6003859: Corrigi o link.
Leftium


51

Eu recomendaria o artigo de Glenn Fiedler sobre a independência robusta de taxa de quadros, " Fix Your Timestep! "

(Menos relevante para o tópico em questão, mas os outros artigos da série também são muito bons - como está tudo em seu site!)


Esses são definitivamente alguns artigos realmente bons. Obrigado por publicar!
hokiecsgrad

11
Em segundo lugar, recomendo uma implementação robusta e independente da taxa de quadros. Tudo no seu jogo deve ser implementado como um valor delta que você atualiza periodicamente. E isso não deve ser feito necessariamente ao mesmo tempo em que você avança para o próximo quadro. De fato, se você pulou um quadro, provavelmente não deseja simplesmente chamar seus métodos de atualização com um delta 2x. Seria mais consistente chamar sua atualização duas vezes com o mesmo delta. Definitivamente, reserve um tempo para aprender os problemas com sua taxa de quadros e seu ciclo de atualização. Você economizará tempo mais tarde.
Dennis Munsie

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.