[Java]Game Loops - Um estudo comparativo Hitskin_logo Hitskin.com

Isto é uma pré-visualização de um tema em Hitskin.com
Instalar o temaVoltar para a ficha do tema

Aldeia RPG
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

[Java]Game Loops - Um estudo comparativo

Ir para baixo

[Java]Game Loops - Um estudo comparativo Empty [Java]Game Loops - Um estudo comparativo

Mensagem por CDZ Qui Nov 01, 2018 12:33 pm

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:
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
}
}
Ótimo, agora nós podemos configurar o “isRunning” para “false” sempre quando quisermos parar o game loop, ou pausar o game, ou qualquer coisa do gênero.
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
}
}
Não sei porque você precisaria fazer da forma desse ultimo exemplo, mas é uma outra maneira que eu tenho visto então eu a inclui aqui para um conteúdo mais completo. A parte de não ser obvio, Eu acho que isso eventualmente causa um stack overflow (alguem me corrija se eu estiver errado).

Parte 2 aqui:  https://lucasindiesh1p.wordpress.com/2018/10/31/aprenda-gameloop/
CDZ
CDZ
Novato
Novato

Mensagens : 22
Créditos : 0

Ir para o topo Ir para baixo

Ir para o topo

- Tópicos semelhantes

 
Permissões neste sub-fórum
Não podes responder a tópicos