Tipo: Tutorial, tradução.
Nível: Intermediário.
Linguagem: java.
Contato e mais informações: https://lucasindiesh1p.wordpress.com
Meu entendimento/tradução do tópico “Game loops!- Eli Delventhal – java-gaming.org”
Original: http://www.java-gaming.org/index.php?topic=24220.0
Há diversas maneiras de fazer game loops, Em geral, você pode pensar um game loop em 3 diferentes maneiras:
1)LOOP – De chamadas de timer para while loops à chamadas de funções recursivas.
2) Mecanismo de contagem/cronometragem/ajustamento – Uma maneira de atrasar(delay) o tamanho de cada iteração do loop, assim voce pega a taxa de frame que você quer.
3) A Interpolação – Uma maneira de fazer a velocidade do game manter-se independentemente da velocidade do loop.
Péssimos Loops:
Vamos começar com os horríveis, que você não deve fazer:
Código Exemplo:
O loop acima é ruim, nunca faça isso nos seus games, pois como depende apenas do processador do computador o tempo processado vai ser diferente para cada computador que o estiver rodando, podendo gerar variações até mesmo na mesma maquina em uma outra vez que executar. E isso é ruim.
Além disso, está faltando um método para interpolação (e a razão disso é que o código acima não oferece meios de se medir o tempo).
Agora, vamos ver este:
Esse é melhor, mas ainda assim não é bom. Pois Thread.sleep nem sempre tem um resultado com precisão, e se você tiver alguma(s) outra(s) threads monopolizando o processador isso não vai permitir a sua thread reassumir em tempo.
Veja o que o javadocs diz sobre isso: “Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers.”
Também está faltando a interpolação. Isso ocorre porque esse tipo de loop assume que a Thread.sleep() está 100% precisa o que não é verdade.
Outro problema que nos vemos em ambos esses loops é o auto-definido loop infinito que é o “while(true)”. Nós sabemos que esse loop nunca acaba. É impossível. Eu vou absolutamente te alertar para não fazer ele. Pois só vai causar problemas. Ainda assim, conceitualmente, nós não queremos que esse loop acabe, é uma boa idéia colocar um booleano nele para pelo menos ter a opção de “matar” o loop.
Veja o exemplo abaixo, uma maneira recursiva bem diferente para fazer o mesmo loop anterior:
Parte 2 aqui: https://lucasindiesh1p.wordpress.com/2018/10/31/aprenda-gameloop/
Nível: Intermediário.
Linguagem: java.
Contato e mais informações: https://lucasindiesh1p.wordpress.com
Meu entendimento/tradução do tópico “Game loops!- Eli Delventhal – java-gaming.org”
Original: http://www.java-gaming.org/index.php?topic=24220.0
Há diversas maneiras de fazer game loops, Em geral, você pode pensar um game loop em 3 diferentes maneiras:
1)LOOP – De chamadas de timer para while loops à chamadas de funções recursivas.
2) Mecanismo de contagem/cronometragem/ajustamento – Uma maneira de atrasar(delay) o tamanho de cada iteração do loop, assim voce pega a taxa de frame que você quer.
3) A Interpolação – Uma maneira de fazer a velocidade do game manter-se independentemente da velocidade do loop.
Péssimos Loops:
Vamos começar com os horríveis, que você não deve fazer:
Código Exemplo:
- Código:
public void gameLoop()
{
While(true)//loop
{
doGameUpdates();
render();
for (int i = 0; i < 1000000; i++); // o mecanismo de contagem/cronometragem/ajustamento
}
}
O loop acima é ruim, nunca faça isso nos seus games, pois como depende apenas do processador do computador o tempo processado vai ser diferente para cada computador que o estiver rodando, podendo gerar variações até mesmo na mesma maquina em uma outra vez que executar. E isso é ruim.
Além disso, está faltando um método para interpolação (e a razão disso é que o código acima não oferece meios de se medir o tempo).
Agora, vamos ver este:
- Código:
public voic gameLoop()
{
while(true)//loop
{
doGameUpdates();
render();
Thread.sleep(1); // O mecanismo de contagem/cronometragem/ajustamento
}
}
Esse é melhor, mas ainda assim não é bom. Pois Thread.sleep nem sempre tem um resultado com precisão, e se você tiver alguma(s) outra(s) threads monopolizando o processador isso não vai permitir a sua thread reassumir em tempo.
Veja o que o javadocs diz sobre isso: “Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers.”
Também está faltando a interpolação. Isso ocorre porque esse tipo de loop assume que a Thread.sleep() está 100% precisa o que não é verdade.
Outro problema que nos vemos em ambos esses loops é o auto-definido loop infinito que é o “while(true)”. Nós sabemos que esse loop nunca acaba. É impossível. Eu vou absolutamente te alertar para não fazer ele. Pois só vai causar problemas. Ainda assim, conceitualmente, nós não queremos que esse loop acabe, é uma boa idéia colocar um booleano nele para pelo menos ter a opção de “matar” o loop.
- Código:
private boolean isRunning;
public void gameLoop()
{
while(isRunning)//loop
{
doGameUpdates();
render();
Thread.sleep(1);// O mecanismo de contagem/cronometragem/ajustamento
}
}
Veja o exemplo abaixo, uma maneira recursiva bem diferente para fazer o mesmo loop anterior:
- Código:
private boolean isRunning;
public void gameLoop(){
doGameUpdates():
render();
Thread.sleep(1);// O mecanismo de contagem/cronometragem/ajustamento
if(isRunning){
gameLoop();// loop
}
}
Parte 2 aqui: https://lucasindiesh1p.wordpress.com/2018/10/31/aprenda-gameloop/