A taxa de quadros deve afetar a velocidade em um mecanismo de jogo?
7
Estou escrevendo um mecanismo de jogo 2D por diversão. Eu sou capaz de executar animação usando o mecanismo. No entanto, se eu alterar a taxa de quadros (quadros por segundo), a velocidade da animação mudará.
Eu nunca usei nenhum mecanismo de jogo. Quero saber se outros mecanismos de jogos lidam com esse problema ou não. Caso contrário, qual é a taxa de quadros ideal para um jogo 2D?
Não, a taxa de quadros não deve afetar a velocidade - a jogabilidade depende inteiramente do desempenho do vídeo, o que é desastroso (mesmo que você limite a velocidade, você não pode controlar as pessoas cujos sistemas rodam o jogo a meia velocidade).
Você está enfrentando esse problema porque fez algo errado: suas rotinas de atualização / renderização são executadas uma após a outra o mais rápido possível, com a atualização de objetos por chamada (assim, quando a velocidade da chamada diverge, a deles também).
Uma abordagem baseada no tempo
A maneira correta de fazer isso é atualizar os objetos por segundo .
Considere um exemplo, por exemplo: No momento, ele provavelmente sabe quanto precisa se mover por quadro. Você precisa transformar isso em quanto ele se move por segundo . Como você faz isso não é realmente muito complicado.
Primeiro, seu marcador será atualizado mais de uma vez por segundo, portanto, precisamos atualizá-lo a cada poucos milissegundos. Cada vez que você atualiza seu mecanismo de física, um certo número de milissegundos se passou desde a última atualização: isso é chamado de tempo delta , normalmente dt para abreviar. O dt é determinado antes de atualizar todos os objetos e, em seguida, todos os objetos são atualizados usando o mesmo dt para manter a sincronização. O dt geralmente é passado como argumento para cada objeto em sua chamada de atualização.
Na física de etapas fixas, o dt é um número fixo, enquanto na física de etapas variáveis, o dt varia dependendo da quantidade real de tempo desde a última atualização (daí os nomes).
Isso nos leva de volta à sua bala. Foi dito para atualizar com um dt de 16 milissegundos, para um mecanismo de física atualizado 60 vezes por segundo: se a bala se mover 12 metros por segundo, você a moverá (16.0/1000.0) * 12.0nesta atualização.
Essa abordagem não é ideal por várias razões. A jogabilidade não é determinística, tornando a sincronização multiplayer muito mais difícil do que deveria ser. Se a taxa de atualização diminuir o suficiente, os objetos podem passar por túneis através de barreiras ou as colisões que devem acontecer podem ser puladas.
AttackingHobo
É por isso que o tempo passado (dt) pode ser fixado, ou seja, de quadros por segundo 5 a 1000, seu mecanismo funciona corretamente. Abaixo de 5fps, você terá uma redução de tempo (ou seja, o dt está preso).
Deceleratedcaviar
@ Daniel, ainda é não determinístico, tornando simulações de rede sincronizadas ou um sistema de reprodução muito mais difícil de implementar. E se você fosse criar um jogo de quebra-cabeça do tipo Rube Goldberg, depois de alguns segundos a simulação não será repetida da mesma maneira todas as vezes.
AttackingHobo
Ah, por algum motivo, pensei que ele estivesse usando um passo fixo com o dt stepping ... Então, certo, isso é ruim.
deceleratedcaviar
5
Para ser justo, essa abordagem é mais do que suficiente para qualquer coisa que não execute física complexa e funcionou em muitos jogos enviados. Portanto, é melhor não ficar muito preocupado sobre a necessidade do passo de tempo fixo e prestação interpolada, etc.
Kylotan
10
A melhor maneira de fazer seu jogo rodar na mesma velocidade em todos os sistemas é usar um Timestep fixo.
Com um timestado fixo, o jogo sempre será atualizado na mesma taxa, independentemente da taxa de renderização, e ao usar a interpolação, ficará suave mesmo quando a taxa de renderização for muito maior que a taxa de atualização.
Não, não deveria. Um tipo de tempo que você pode fazer no seu jogo é o tempo baseado em quadros. A idéia é deixar o jogo rodar o mais rápido que o seu computador pode executá-lo, obtendo a experiência geral do bast e você controla a taxa na qual a simulação é executada. Agora você separou sua atualização da renderização e tem controle preciso sobre ela.
Nesse cenário, o loop do jogo pode estar sendo executado a, digamos, 60 fps em uma máquina e talvez 45 ou algo diferente em outra, mas sua simulação sempre será executada na taxa precisa especificada entre elas.
Seu jogo agora está dividido em duas seções, uma para renderizar seus gráficos e outra para atualizar sua simulação. Você define a taxa de simulação desejada no início do jogo e, no topo do ciclo do jogo, obtém o tempo decorrido. Observe que esse tempo decorrido é uma quantidade de tempo com base na taxa de simulação desejada. Esse valor é usado como um multiplicador contra os objetos do jogo para mantê-los em movimento na / ou muito perto da taxa de simulação desejada. Por exemplo, se você deseja que sua simulação seja atualizada a 30 qps e o loop do jogo esteja sendo executado a 60 qps, o valor do tempo decorrido para esse quadro será 0,5. Quando você multiplica isso pela velocidade dos seus objetos em movimento, eles fazem com que eles se movam a 30 qps. Saiba que, de um quadro para outro, a velocidade do loop do jogo varia bastante e o tempo de base do quadro pode manter a simulação em execução a uma taxa conhecida e previsível.
-1 Trata-se apenas de atualizações de etapas fixas (como explicado na minha resposta e na AttackingHobo), exceto que as coisas ocorrem a uma taxa de quadros por quadro, em vez de qualquer medida intuitiva como por segundo. Se você for tão longe, é apenas um pequeno passo para fazer as coisas por segundo e poupar toda a aritmética mental não intuitiva que traduz entre velocidades por segundo e velocidades por quadro (e tornar tudo muito mais simples se você altera sua taxa de quadros).
A melhor maneira de fazer seu jogo rodar na mesma velocidade em todos os sistemas é usar um Timestep fixo.
Com um timestado fixo, o jogo sempre será atualizado na mesma taxa, independentemente da taxa de renderização, e ao usar a interpolação, ficará suave mesmo quando a taxa de renderização for muito maior que a taxa de atualização.
Aqui está uma resposta com recursos sobre como implementar um timestep fixo.
Timestep semi-fixo ou totalmente fixo?
Aqui está uma resposta que explica como implementar a interpolação para movimento e transformações.
Como interpolar entre dois estados do jogo?
fonte
Não, não deveria. Um tipo de tempo que você pode fazer no seu jogo é o tempo baseado em quadros. A idéia é deixar o jogo rodar o mais rápido que o seu computador pode executá-lo, obtendo a experiência geral do bast e você controla a taxa na qual a simulação é executada. Agora você separou sua atualização da renderização e tem controle preciso sobre ela.
Nesse cenário, o loop do jogo pode estar sendo executado a, digamos, 60 fps em uma máquina e talvez 45 ou algo diferente em outra, mas sua simulação sempre será executada na taxa precisa especificada entre elas.
Seu jogo agora está dividido em duas seções, uma para renderizar seus gráficos e outra para atualizar sua simulação. Você define a taxa de simulação desejada no início do jogo e, no topo do ciclo do jogo, obtém o tempo decorrido. Observe que esse tempo decorrido é uma quantidade de tempo com base na taxa de simulação desejada. Esse valor é usado como um multiplicador contra os objetos do jogo para mantê-los em movimento na / ou muito perto da taxa de simulação desejada. Por exemplo, se você deseja que sua simulação seja atualizada a 30 qps e o loop do jogo esteja sendo executado a 60 qps, o valor do tempo decorrido para esse quadro será 0,5. Quando você multiplica isso pela velocidade dos seus objetos em movimento, eles fazem com que eles se movam a 30 qps. Saiba que, de um quadro para outro, a velocidade do loop do jogo varia bastante e o tempo de base do quadro pode manter a simulação em execução a uma taxa conhecida e previsível.
O resultado é uma animação suave e sedosa.
fonte