Suporte no desenvolvimento de jogos


    [Java]Game Loops - Um estudo comparativo

    CDZ
    CDZ
    Novato
    Novato

    Mensagens : 22
    Créditos : 0
    Cash : 0

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

    Mensagem por CDZ em 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/

      Data/hora atual: Qua Maio 22, 2019 2:08 am