Eu tenho ratos olhando e andando no meu jogo, mas eles são muito lentos e difíceis de usar. Eu acho que é porque estou usando velocidade fixa. Ouvi dizer que em grandes projetos os desenvolvedores usam o tempo delta. Como faço para calcular o tempo delta no excesso? Como calculo a velocidade usando o tempo delta?
14
Respostas:
O "tempo delta" costumava ser o tempo decorrido entre duas atualizações de quadros (mas também pode ser usado em outros contextos; geralmente é o resultado de uma subtração de tempo).
Você pode obter o tempo delta em excesso usando o método glutGet e o parâmetro GLUT_ELAPSED_TIME, além de algumas operações.
A linha a seguir retorna o número de milissegundos desde que glutInit foi chamado (ou primeira chamada para glutGet (GLUT_ELAPSED_TIME)):
Portanto, se você registrar o timeSinceStart atual em cada loop de renderização, poderá conhecer o deltaTime subtraindo o antigo para o novo.
Você também pode fazer isso quase da mesma maneira, usando a biblioteca ctime C / C ++ com clock () e a expressão constante de macro CLOCKS_PER_SEC que especifica a relação entre um tique de relógio e um segundo.
Basicamente, você pode usar deltaTime para atualizar seus movimentos na proporção desse tempo decorrido, em vez de usar um valor de tempo fixo. Dessa forma, a velocidade de movimento do seu personagem deve ser quase a mesma se o seu programa for executado a 60 qps ou se a 10 qps.
Aqui está um pequeno exemplo: suponha que você queira mover algo em 10 unidades por segundo no eixo x. Você poderia fazer algo assim (se deltaTime usar milissegundos de fato).
Dessa forma, se seu programa atualizou 2 ou 100 vezes, 1 segundo depois, a posição deve ser quase a mesma e o jogo é menos impactado pelos baixos fps de um computador pequeno do que se usasse valores fixos.
Com valores fixos ==> fps baixos = menos atualizações = movimentos lentos, enquanto fps alto = mais atualizações = movimentos muito rápidos.
Com deltaTime ==> "quase" os mesmos movimentos.
Por fim, você deve ler Etapa de tempo fixo versus Etapa de tempo variável em gamedev.stackexchange.
fonte
positive int
costumo ir até 2.147.483.647 se assinado e até 4.294.967.295 se não assinado ... por isso mesmo se considerarmos o menor, 2.147.483.647 milissegundos é quase 25 dias ... Deve ser o bastante para lidar com a maioria jogo temporizadores e, mesmo que não seja suficiente, ainda podemos usar razoavelmenteunsigned int
(~ 50 dias) ou até umlong long
(como eu costumo fazer).QueryPerformanceCounter
no Windows egettimeofday
na maioria dos outros. Você precisará sujar as mãos e procurar um pouco mais do que o denominador menos comum das APIs da plataforma, especialmente em C e C ++.