Qual é o ponto "delta" neste código? Isso reflete uma coisa padrão no game dev?


24

Eu sei muito pouco sobre programação de jogos, mas gostaria de aprender mais. Estou tentando entender o código para este jogo. Estou tentando entender por que o código está passando um "delta" para Shipcontrols.js, que altera a direção do navio com base na entrada do usuário.

Basicamente, o jogo calcula "delta" a cada loop ...

Aqui está uma versão abreviada da pilha que usa delta através de um loop ...

var delta = now - this.time;
this.time = now;
this.current.render.call(this.current, delta, this.renderer);  

Passos para aqui ...

ctx.manager.add("game", scene, camera, function(delta, renderer)
{
if(delta > 25 && this.objects.lowFPS < 1000) this.objects.lowFPS++;
var dt = delta/16.6;
this.objects.components.shipControls.update(dt); 

Passos para aqui ...

bkcore.hexgl.ShipControls.prototype.update = function(dt)
{
var pitchAng;
var yaw;
var roll;
if (undefined != hand){ 

O que faz coisas assim ...

if(this.key.forward)
    this.speed += this.thrust * dt;
else

e isto...

if(this.key.right)
{
    angularAmount -= this.angularSpeed * dt;

Qual é o objetivo do delta aqui? Está apenas tentando introduzir um elemento aleatório? O código para este jogo é muito bom. Por que esse cara usou delta?


2
"Está apenas tentando introduzir um elemento aleatório?" Na verdade, o oposto exato é verdadeiro, o objetivo do delta aqui é reduzir a aleatoriedade e normalizar a física no mecanismo do jogo.
zzzzBov

Respostas:


27

Este é o "delta do tempo". É quanto tempo se passou desde a atualização anterior. É necessário garantir que animações, física etc. funcionem na velocidade certa.

O código está sendo executado uma vez por atualização de quadro. No entanto, não há garantia de que os quadros sejam desenhados a uma velocidade constante. Um quadro pode levar 1/60 de segundo e o próximo pode levar 1/30. Se você não medir e explicar isso, o jogo será instável e ocorrerá muito rápido ou muito devagar em várias circunstâncias.

Os deltas de tempo são frequentemente aplicados na física, pois é assim que as equações são especificadas para integrações simples de Euler. A integração da velocidade na posição é definida como o x1 = x0 + v * (t1 - t0)que simplifica o código x += v * dt. Portanto, deltas de tempo são necessários para avaliar as atualizações físicas.

É muito, muito normal que deltas de tempo sejam medidos e aplicados.


Acho que essa é a melhor resposta, porque explica que 'dt' pode variar muito, e é por isso que precisamos interpolar os cálculos da física com ela.
BiAiB

Pode-se notar que um grande problema com deltas de tempo em alguns contextos é que, em muitos casos, eles estarão "desligados" por um quadro. Se algo fizer com que uma atualização de quadro demore duas vezes mais que o normal, o delta aplicado ao calcular as ações desse quadro será o habitual, mesmo que o quadro não seja exibido até o momento em que os objetos devem ser mostrados se movendo duas vezes mais longe como eles fizeram. Se o tempo entre esse quadro e o próximo for menor que o normal (pode ocorrer se o temporizador tentar "recuperar o atraso", os dois quadros com menos tempo do que o normal entre eles serão mostrados ...
supercat

... uma distância maior que o normal entre as posições do objeto).
Supercat

@supercat: Esse é apenas o material habitual do Fix Your Timestep . Você ainda precisa de deltas de tempo por quadro para saber quando executar uma simulação fixa.
Sean Middleditch

@SeanMiddleditch: Como alguém que codificou jogos para o Atari 2600, acho curioso que ninguém lamente o fato de que nos sistemas modernos há um atraso inevitável entre quando o jogador move um controle e quando o personagem responde. Em muitos jogos do Atari 2600, o controle é pesquisado a cada 16,7 ms e as atualizações do jogador ocorrem de 1 a 16 ms (dependendo da posição vertical); equipamentos modernos são incapazes de reagir tão rapidamente.
Supercat 19/11

32

"Delta", "d" ou "Δ", significa "diferença" em um contexto matemático . Sempre que houver uma diferença de diferença entre dois números com significados semelhantes, essa diferença pode ser chamada de "delta" ou "d".

Deltas são muito comuns no desenvolvimento de jogos. Por exemplo, a diferença entre a coordenada X de um personagem um segundo atrás e a coordenada X agora pode ser chamada de "delta x" e é geralmente denominada como dx, delta_xou d_x.

Além disso, é muito comum ter a diferença entre duas vezes, como no seu código:

var delta = now - this.time;

Nesse caso, essa variável está denotando a diferença entre algum tempo armazenado this.timee o tempo armazenado now.

Os deltas são comumente usados ​​para representar a mudança de algo no tempo. Por exemplo, se você sabe que a coordenada X de um jogador deve mudar 5 pixels a cada quadro, você pode armazenar essa alteração como um delta:

var delta_x = 5

E, em seguida, use esse delta para aplicar a alteração sempre que precisar:

player.x = player.x + delta_x

Mas lembre-se de que isso é apenas uma convenção. Ninguém obriga a nomear suas variáveis ​​"delta" ou "d", mas isso pode ajudar alguém que lê seu código ou a si mesmo, se você o ler no futuro, a entender o que a variável deve fazer.

Outras letras gregas comuns amplamente usadas na programação são:

Epsilon : por um valor muito pequeno. Comumente usado ao comparar ponto flutuante ou outras variáveis ​​com problemas de precisão:

const epsilon = 0.0001
...
if abs(some_float - other_float) < epsilon then
    -- close enough, let's say they're equal
end

Pi : para a constante homônima

Teta : para representar ângulos

Lambda : para representar funções ou fechamentos anônimos


11
Você também verá certos múltiplos de π, como 2π, π / 2, π / 4 e e (constante de Euler).
Jzx #

@ Thomas: Claro, qualquer programa com base matemática trará a notação teórica para o código. Observe a frase "Outras letras gregas comuns amplamente usadas na programação são". " algum código gráfico" dificilmente se qualifica como "comum" ou "amplamente utilizado". Eu nunca afirmei que essas são as únicas letras gregas que podem ser usadas, nem que esses são os únicos significados que você pode definir para essas letras gregas.
Panda Pajama

@yzx: A última vez que verifiquei, a constante de Euler usou a letra latina "e". Eu não estava falando de constantes matemáticas que aparecem no código, mas de letras gregas comumente usadas no código.
Panda Pyjama

@PandaPajama Excluí meu comentário, pois não é bem-vindo.
19413 Thomas

3
Se seus camaradas são particularmente modernos, você pode até ver Tau (τ) em vez de 2π.
perfil completo de Kaz Dragon

3

dtsignifica delta time. É usado no cálculo da taxa de quadros para garantir que o jogo seja executado na mesma velocidade, independentemente da taxa de quadros.

Mais informações framerate independencepodem ser encontradas aqui .


3

dt (tempo delta) é o tempo entre cada quadro de ciclo / renderização (ou qualquer carimbo de data / hora desejado) do seu loop. Com esse tempo delta, podemos esticar certos valores ao longo do tempo. Assim como no mundo real, medimos certas propriedades físicas ao longo do tempo.

Digamos que rodemos nosso jogo 60 frames por segundo. Se queremos que nosso player mova 5 pixels por segundo, fazemos

 5 * (1/60); //Assuming we have a stable delta time of 0.016
 // (1/60) = 0.016 || 0.016 * 5 =  0.083 --> moved per frame || 60 frames * 0.083 = 5

ou

 5 * (newTime - oldTime); //aka dt

O personagem move 5 pixels por 60 quadros. Quanto mais tempo o seu ciclo demorar, maior será o tempo delta.

Para cada taxa de quadros (1/30, 1/25, etc), o resultado será o mesmo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.