É seguro usar Sleep () no loop do jogo (no Windows)?


27

É seguro usar a função Sleep () no Windows no loop de jogo (C ++)? Eu quero ter uma taxa de quadros fixa.


Você precisa esclarecer o que você quer dizer com "seguro". Claro que é seguro e não vai corromper a memória ou explodir o PC dos jogadores.
Kromster diz apoio Monica

Respostas:


32

Não, não é. O sono garante apenas um tempo mínimo para dormir, mas ele pode realmente dormir por qualquer período arbitrário durante esse período. Sua resolução do timer (definida via timeBeginPeriod) também é importante para ela, e mesmo se você estiver usando outra coisa (como QueryPerformanceCounter) no seu timer, ainda precisará do timeBeginPeriod para controlar o sono.

Então, em resumo:

  • A hora de dormir é apenas um mínimo garantido e o tempo real de sono pode ser maior.
  • Sensível ao valor definido (ou não definido) via timeBeginPeriod.

O único argumento razoável para usar o Sleep seria se você quisesse reduzir o uso da CPU para, por exemplo, dispositivos móveis. Mesmo assim, você usaria Sleep (1); usá-lo para controlar taxas de quadros não é o caminho a percorrer.

Forçar o vsync ativado é provavelmente uma maneira comum de obter uma taxa de quadros fixa, mas mesmo assim, um hardware diferente será executado em taxas de atualização diferentes e você não poderá ter uma taxa de quadros fixa consistente em máquinas diferentes (isso depende do tipo de hardware você está alvejando, é claro).

Neste momento, é necessário mencionar este artigo: Gaffer On Games - Fix Your Timestep! . Isso descreve as etapas necessárias para obter um passo consistente em sua simulação.


Agradecimentos imensos pelo link. Até agora, eu costumava usar a abordagem "variável timestep" descrita no artigo.
Ivan Vučica 23/10

O sono também é perigoso em máquinas com o passo de velocidade da Intel ativado.
waterwizard11

"mas, na verdade, pode adormecer por um período arbitrário de tempo." Bem, isso tem que ser provado, eu acho ... Nunca vi nenhuma prova disso, então eu acho que é uma daquelas 'definições'. Boa resposta, porém, e sim, você não pode (mesmo que seja preciso) usar qualquer tipo de suspensão para definir uma taxa de quadros fixa (você pode, mas precisa de um cronômetro de alta precisão).
Valmond

2
Por MSDN - "Observe que não é garantido que um thread pronto seja executado imediatamente. Consequentemente, o thread não poderá ser executado até algum tempo após o intervalo de suspensão". É verdade que nunca vi isso acontecer, mas, ao mesmo tempo, se for documentado como possível, eu definitivamente não confiaria que isso nunca acontecesse.
Maximus Minimus 23/10

11
Vale mencionar, acho que isso se relacionaria a "... se você quiser reduzir o uso da CPU ...": nanobit.net/doxy/quake3/win__main_8c-source.html <- o código relevante começa em 01224
user_123abc

16

Resposta curta: não, não é.

Para ter uma taxa de quadros fixa, é necessário chamar uma determinada função de retorno de chamada que força uma taxa de quadros específica. Obviamente, se você não decidir quanto tempo uma única iteração em um loop levará, não poderá definir um tempo de suspensão fixo.

GLUT fornece glutTimerFunc () , que é, se você estiver programando no OpenGL, a função correta de que precisa. Dê uma olhada neste exemplo ou neste .


11
"Após pelo menos milissegundos de ms, o OpenGLUT chamará retorno de chamada" - qual é a diferença Sleep?
Kromster diz apoio Monica
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.