Alguém pode me explicar esse código para estabeler fps em um game loop (java)?

É o seguinte, depois de um tempinho estudando java, comecei a estudar a lógica dos games, tal como o game loop, porém nesse game loop (da imagem) tem esse código para estabelecer o fps para o jogo e eu não entendi muito bem como esse código funciona, eu até fiz um try{Thread.sleep(1000/fps);}catch(exception e){} e funciou igualmente a esse código, mas pelo que eu entendi esse código da imagem é mais eficiente e por isso gostaria de entender ele. Tem um outro também que se utiliza deltaTime que se alguém souber e puder explicar, eu agradeceria.

Essa Variável fps é igual a 60.

Meu inglês é bem basicão, essa descrição aí é porque eu estou aprendendo por um canal gringo
e tava usando legendas em pt, confesso que entendi mais nas legendas em inglês mesmo, mas mesmo assim não entendi muito bem esse código.

O link do vídeo: Game Loop and Key Input - How to Make a 2D Game in Java #2 - YouTube

Este artigo dá uma explicada em português: O loop de animação . Não é idêntico, mas o conceito é o mesmo em praticamente qualquer tutorial de game loop.

Tem este vídeo também : 🇧🇷 Introdução a Programação - 26 - Game Loop - YouTube , mas não assisti pra ver quão preciso é.

O código da imagem é mais eficiente porque ele “dorme” (usando Thread.sleep()) por um tempo variável, em vez de um tempo fíxo. Esse tempo variável depende de quanto tempo as operações update() e repaint() demoram. Ou seja, se demorar mais pra atualizar os objetos e desenhá-los, a Threade dorme por menos tempo, e vice-versa. É isso que ajuda a garantir um fps mais estável.

Se você simplesmente divide 1000 por 60, não vai ter um fps fixo, pois o tempo das operações update e repaint não é levado em conta. Isso pode não parecer óbvio em um jogo simples com poucos elementos na tela, mas imagine um com milhares de objetos, aplicando vários efeitos e afins. É aí que esse tipo de diferença se torna mais notável.

Abraço.

1 curtida

Tem um outro também que eu usei que ele não inclui o método sleep, mas pelo visto é tão eficiente quanto.

Para melhor entendimento, ignore as variáveis “timer” e “drawCount” e o último if, estes servem apenas para exibir o fps no console.

Eu vou dar uma estudadinha nessa lógica de estabelecer um fps para o jogo, porque ainda não entendi mt bem, mas já entendi o porque de usar esses das imagens em vez de usar só o sleep.

O código dessa imagem usa um intervalo de tempo (delta) mas também não compreendi, acho que uma forma interessante para compreender seria se eu fizesse esses cálculos no papel subtituindo essas variáveis por númenos .

Esse código também é do mesmo vídeo que eu citei antes.

Nesse segundo caso, o if(delta > 1) faz com que update e repaint sejam chamados apenas quando o decorrido o tempo necessário se passou. É basicamente um jeito diferente de ter o mesmo efeito do código anterior.

Sim, se você quer entender cada passo do fluxo, nada melhor que fazer os cálculos e ver os valores. Teste de mesa era algo bem comum em qualquer curso de programação antigamente, mas não sei como é atualmente. Eu mesmo fiz muitos algoritmos na mão quando comecei.

Abraço.

1 curtida