이 코드에서 "델타"의 요점은 무엇입니까? 게임 개발에서 표준적인 것을 반영합니까?


24

게임 프로그래밍에 대해서는 거의 알지 못하지만 더 배우고 싶습니다. 게임 의 코드를 이해하려고합니다 . 코드가 왜 "델타"를 Shipcontrols.js에 전달하는지 이해하려고합니다.이 컨트롤은 사용자 입력에 따라 선박의 방향을 변경합니다.

기본적으로 게임은 모든 루프 "델타"를 계산합니다 ...

다음은 하나의 루프를 통해 델타를 사용하는 약식 버전의 스택입니다.

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

여기에 단계 ...

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); 

여기에 단계 ...

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

이 같은 것들을 ...

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

이...

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

델타의 요점은 무엇입니까? 무작위 요소를 도입하려고합니까? 이 게임의 코드는 매우 좋습니다. 왜이 사람이 델타를 사용 했습니까?


2
"임의의 요소를 도입하려고하는 것입니까?" 실제로 정반대의 경우는 델타의 목적이 무작위성을 줄이고 게임 엔진의 물리를 정규화하는 것입니다.
zzzzBov

답변:


27

이것이 "시간 델타"입니다. 이전 업데이트 이후로 경과 된 시간입니다. 애니메이션, 물리 등이 올바른 속도로 실행되고 있는지 확인해야합니다.

코드는 프레임 업데이트마다 한 번씩 실행됩니다. 그러나 프레임이 일정한 속도로 그려지는 것은 아닙니다. 한 프레임은 1/60 초가 걸리고 다음 프레임은 1/30 초가 걸릴 수 있습니다. 이것을 측정하고 설명하지 않으면 게임이 불안하고 다양한 상황에서 너무 빠르거나 느리게 실행됩니다.

시간 델타는 물리학에 종종 적용되는데, 이는 간단한 오일러 통합을 위해 방정식이 지정되는 방식입니다. 속도를 위치에 통합 x1 = x0 + v * (t1 - t0)하는 것은 코드처럼 단순화하는 것으로 정의됩니다 x += v * dt. 따라서 물리 업데이트를 평가하려면 시간 델타가 필요합니다.

타임 델타를 측정하고 적용하는 것은 매우 정상입니다.


나는 이것이 'dt'가 많이 다를 수 있다고 설명하기 때문에 이것이 가장 좋은 대답이라고 생각합니다. 따라서 물리 계산을 보간해야합니다.
BiAiB

일부 상황에서 타임 델타의 주요 문제는 많은 경우 프레임에 의해 "꺼질"것입니다. 어떤 것이 하나의 프레임 업데이트가 평소보다 두 배 오래 걸리는 경우, 객체가 두 배까지 이동 한 것으로 보일 때까지 프레임이 표시되지 않더라도 해당 프레임의 동작을 계산할 때 적용되는 델타는 일반적인 것입니다. 그들이했던 것처럼. 해당 프레임과 다음 프레임 사이의 시간이 평소보다 작은 경우 (타이머가 "캐치"하려고하면 발생할 수 있음) 프레임 사이의 시간이 평소보다 적은 두 프레임은 다음과 같이 표시됩니다.
supercat

... 물체 위치 사이의 거리가 평소보다 큼).
supercat 2011

@ supercat : 그것은 단지 일반적인 Time Your Timestep 물건입니다. 그래도 고정 시뮬레이션을 언제 진행해야하는지 알기 위해서는 프레임 별 시간 델타가 필요합니다.
Sean Middleditch

@SeanMiddleditch : Atari 2600을위한 게임을 코딩 한 사람으로서, 현대 시스템에서 플레이어가 컨트롤러를 움직일 때와 캐릭터가 응답 할 때 사이에 피할 수없는 지연이 없다는 사실에 아무도 슬퍼하지 않는다는 점이 궁금합니다. 많은 Atari 2600 게임에서 컨트롤은 16.7ms마다 폴링되며 플레이어 업데이트는 1-16ms 이내에 발생합니다 (수직 위치에 따라 다름). 최신 장비는 그에 신속하게 반응 할 수 없습니다.
supercat 2011

32

"델타", "d"또는 "Δ"는 수학적 문맥에서 "차이"를 의미한다 . 비슷한 의미를 가진 두 숫자 사이에 차이가있을 때마다 그 차이를 "델타"또는 "d"라고 할 수 있습니다.

델타는 게임 개발에서 매우 일반적입니다. 예를 들어, 1 초 전에 문자의 X 좌표와 X 좌표의 차이를 "델타 x"라고하며 일반적으로 dx, delta_x또는 로 표시됩니다 d_x.

또한 코드에서와 같이 두 번의 차이를 갖는 것이 매우 일반적입니다.

var delta = now - this.time;

이 경우, 해당 변수에 저장된 어떤 시간의 차이 나타내는된다 this.time및 저장 시간 now.

델타는 일반적으로 시간의 변화를 나타내는 데 사용됩니다. 예를 들어, 플레이어의 X 좌표가 프레임마다 5 픽셀 씩 변경되어야한다는 것을 알고 있다면이 변경 사항을 델타로 저장할 수 있습니다.

var delta_x = 5

그런 다음 해당 델타를 사용하여 필요할 때마다 변경 사항을 적용하십시오.

player.x = player.x + delta_x

그러나 이것은 컨벤션 일뿐입니다. 아무도 변수의 이름을 "델타"또는 "d"로 지정하도록 강요하지 않지만, 그렇게하면 코드를 읽는 다른 사람이나 나중에 코드를 읽는 사람이 변수의 역할을 이해하는 데 도움이 될 수 있습니다.

프로그래밍에 널리 사용되는 다른 일반적인 그리스 문자는 다음과 같습니다.

엡실론 : 아주 작은 가치. 부동 소수점 또는 기타 변수를 정밀 문제와 비교할 때 일반적으로 사용됩니다.

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

Pi : 시상수

세타 : 각도 표현

Lambda : 익명 함수 또는 클로저 표현


1
2π, π / 2, π / 4 및 e와 같은 특정 π의 배수도 볼 수 있습니다 (오일러 상수).
jzx

@Thomas : 물론, 수학 기반의 모든 프로그램은 이론적 표기법을 코드로 가져옵니다. " 프로그래밍에 널리 사용되는 다른 일반적인 그리스 문자는 "이라는 문장에 주목하십시오 . " 일부 그래픽 코드"는 "공통"또는 "일반적으로 사용되는"것으로 간주되지 않습니다. 나는 이것들이 사용 가능한 유일한 그리스 문자라고 주장하지 않았으며, 그 그리스 문자에 대해 설정할 수있는 유일한 의미라고 주장하지 않았습니다.
팬더 파자마

@ yzx : 마지막으로 확인했을 때 오일러 상수는 라틴 문자 "e"를 사용했습니다. 코드에 나타나는 수학 상수에 대한 이야기가 아니라 코드에 일반적으로 사용되는 그리스 문자에 대해 이야기했습니다.
팬더 파자마

@PandaPajama 환영하지 않으므로 내 의견을 삭제했습니다.
토마스

3
동지가 특히 엉덩이라면, 2π 대신 타우 (τ)를 볼 수도 있습니다.
Kaz Dragon

3

dt의 약자 delta time. 프레임 속도에 관계없이 게임이 같은 속도로 실행되도록 프레임 속도 계산에 사용됩니다.

에 대한 자세한 정보를 framerate independence찾을 수 있습니다 여기에 .


3

dt (델타 시간)는 루프의 각주기 / 렌더 프레임 (또는 원하는 타임 스탬프) 사이의 시간입니다. 이 델타 시간으로 시간이 지남에 따라 특정 값을 늘릴 수 있습니다. 실제와 마찬가지로 시간이 지남에 따라 특정 물리 속성을 측정합니다.

게임을 초당 60 프레임으로 실행한다고 가정 해 봅시다. 플레이어가 초당 5 픽셀 씩 움직 이도록하려면

 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

또는

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

캐릭터는 60 프레임 위로 5 픽셀 이동합니다. 사이클이 길수록 델타 시간이 길어집니다.

모든 프레임 속도 (1/30, 1/25 등)에 대해 결과는 동일합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.