Eu li que a velocidade dos objetos do jogo não deve ser prejudicada pelo FPS, mas sim pelo tempo. Como posso separar o código de atualização / desenho para maximizar o desempenho sem limitar a taxa de desenho e fornecer uma taxa de atualização lógica constante com base no tempo?
Meu pseudo-código atual é o seguinte
loop
{
draw();
if (ticksElapsed() > 100)
{
update();
ticks+= ticksElapsed();
}
}
O problema é que o código do desenho dificulta o desempenho da taxa de atualização (). E consome 100% da CPU, porque se o sono é acionado, ele desativa as duas funções de desenho / lógica.
Também estou usando SDL e ele não parece ter uma opção vsync. Também ouvi falar dos termos tempo fixo e variável, mas não tenho certeza de como isso pode ser feito com o sono ()
sdl
frame-rate
logic
fixed-timestep
Oskenso Kashi
fonte
fonte
Respostas:
No seu snippet de código, parece que você está tentando executar seu jogo no modo de etapa de tempo fixo, aguardando se o desenho e a atualização demorar menos de 15ms (60fps). Isso é possível e você adivinhou certo que isso não pode ser feito usando uma chamada de suspensão, porque você não sabe exatamente quanto tempo vai dormir. O ciclo de espera ocupada é a boa solução.
No entanto, considere o caso em que sua atualização e desenho excedem 15ms, agora você tem o desenho e a atualização do jogo mais lentos. Agora você pode fazer duas coisas: detectar esse estado e soltar quadros (pule o desenho e vá direto para a atualização até que esteja sincronizado novamente); no entanto, se o computador estiver lento, ele nunca será recuperado.
Uma outra solução é tornar sua lógica de atualização independente por tempo fixo. Você não precisa de um thread separado para isso, basta respeitar a velocidade com que as coisas devem se mover. Em vez de 5 pixels por tick, você deve usar 50 pixels por segundo. Você precisaria de um cronômetro de alta precisão para conseguir isso, e toda a sua lógica de atualização deve poder acessar o cronômetro para ver quanto tempo se passou desde a última atualização.
Basicamente você vai de:
Para
fonte