Estou criando um iphone shmup e tentando decidir que tipo de loop de jogo usar. Desejo usar timestep semi-fixo ou timestep totalmente fixo.
Com o timestep semi-fixo, farei zero ou mais chamadas de atualização (FIXED_INTERVAL) seguidas por uma chamada de atualização (dt) em que dt <= FIXED_INTERVAL por loop do jogo. Pelo que entendi, as desvantagens desse método são que minha lógica de atualização física (dt) será mais difícil de programar, porque basicamente preciso assumir uma variável dt para cada atualização. E também ouvi dizer que cada execução do meu jogo será um pouco diferente devido aos valores de ponto flutuante não serem os mesmos todas as vezes.
Então, com timestep totalmente fixo, estou fazendo zero ou mais chamadas de atualização (FIXED_INTERVAL) seguidas de uma chamada de interpolação (dt / FIXED_INTERVAL) em que dt <FIXED_INTERVAL por loop do jogo.
Então parece que a grande decisão que realmente tenho que tomar é: quero enfrentar o desafio de implementar uma atualização (dt) com uma variável dt ou quero enfrentar o desafio de implementar a interpolação?
Agora, pelo que li, a maioria das pessoas está dizendo para usar totalmente fixo e fazer a interpolação. Mas quando penso em implementar a interpolação, parece que eu seria muito mais complexo do que uma atualização (dt) com a variável dt. Isso ocorre porque, se eu usar a interpolação, tenho que lembrar o estado anterior e o atual. Então, se eu quiser usar a interpolação, tenho que criar uma camada adicional de indireção que abstraia estados individuais inteiros do jogo. Enquanto no timestep semi-fixo, onde não preciso usar a interpolação, não preciso criar uma abstração do estado do jogo, porque sempre há apenas um estado do jogo e são simplesmente as "matrizes globais" que representam meus inimigos e inimigos. balas etc.
Então, qual é a opção mais prática: eu o implemento semifixo, sabendo que minhas atualizações de física podem ficar complicadas com a variável dt. Ou eu uso totalmente fixo e tento criar uma abstração de estado do jogo para poder acompanhar o estado anterior e o estado atual para executar a interpolação?
Respostas:
Totalmente fixo
Você perde a maioria dos benefícios de um passo fixo ao lançar uma etapa variável uma vez a cada quadro.
Noel Lopis tem uma ótima descrição de como ele implementou uma etapa de tempo fixo em seu jogo Casey's Contraptions . Como bônus para você, ele é desenvolvedor de iphone, embora sua técnica não seja específica para iphone.
Alguns destaques do artigo
fonte
O que você chama de timestep "semi-fixo" e "totalmente fixo" são, na minha opinião, ambos timestap fixo - o dt que você está passando para a sua
update
chamada não muda entre os quadros.Portanto, sua pergunta é realmente "eu quero implementar interpolação para fins de renderização?" A resposta é: provavelmente não .
A interpolação é algo que você só gostaria de fazer se o seu
update
timestep fixo for significativamente diferente dorender
timestep de destino . Não é incomum que jogos com umaupdate
fase extenuante chamem apenasupdate
a, digamos, 10Hz, mas renderizem na taxa de quadros máxima.Como você está escrevendo um shmup do iPhone, nem a sua
update
nem a suarender
necessidade exigem muito uso de CPU; você pode bloquear facilmente a taxa de quadros em 30Hz ou 60Hz, não se incomodar com a implementação e ainda ter um jogo de aparência suave.fonte
dt
paraupdate
erender
é a coisa mais simples que funcionaria, mas geralmente evitada ao usar mecanismos de física pela instabilidade que ela causa. Portanto, chamarupdate
com um valor fixodt
e renderizar na mesma taxa (ao mesmo tempo em que elimina os quadros se oupdate
tempo for longo) geralmente é a coisa mais simples que funcionaria. Escrever código para interpolar objetos entreupdate
chamadas adiciona complexidade ao seu código; complexidade que você está adicionando para resolver nenhum problema em particular.