bdfgdfg

델타타임-deltaTime 본문

게임프로그래밍

델타타임-deltaTime

marmelo12 2021. 9. 22. 18:25
반응형

DeltaTime

델타타임은 간단하게 말해서 바로 이전 프레임을 수행하는데 걸린 시간을 의미한다.

우선 이 델타타임의 필요성부터 알아보자.

 

컴퓨터의 성능이 높아지고 컴퓨터들간의 성능차이가 존재해 프레임 처리 속도의 차이가 발생한다.

 

어떤 2D 카트게임이 있다고 보자.

어떤 컴퓨터는 10FPS* 다른 컴퓨터는 20FPS라고 할 때

1프레임에 1M를 이동한다면 두 컴퓨터가 같은 시간에 처리하는 프레임이 다르므로 

10FPS의 카트는 초당 10M를 이동하며 20FPS의 카트는 초당 20M를 이동하는거다.

(초당 처리하는 프레임이 각각 10,20이므로)

*(FPS -> Frame Per Second - 초당 처리할 수 있는 프레임의 수).

 

두 카트의 성능은 같은데 컴퓨터의 성능이 달라 발생한 현상.

 

하지만 게임에서는 똑같은 조건이라면 두 카트가 균등한 속도가 나와야한다. (컴퓨터의 성능과는 달리)

위와 같이 컴퓨터간의 성능이 다르더라도 유저들간의 프레임 처리 속도 차이를 똑같이 맞춰주는게 중요하다.

이를 위해 델타타임(DeltaTime)의 필요성이 나온 것.

 

다시 델타타임의 정의해보면 '이전 프레임을 수행하는데 걸린 시간'을 의미한다.

10FPS의 카트는 초당 처리하는 프레임이 10. 즉 1프레임을 처리하는데 걸리는 시간이 1/10초.

이 1/10초가 델타 타임. (이전 프레임을 처리한 시간이므로)

이 델타타임을 카트의 이동 거리에 곱해주면 된다.

 

1프레임에 카트가 1M를 이동한다고 했으므로

 

10FPS의 컴퓨터는 10FPS * 1/10(델타타임) = 1M

20FPS의 컴퓨터는 20FPS * 1/20(델타타임) = 1M

 

위와 같이 두 컴퓨터의 FPS는 다르지만 델타타임을 곱해줌으로써 같은 시간에 같은 거리를 이동한 것.

 

 

[유니티 기초] Time.deltaTime (tistory.com)를 참고하였습니다.

 

실제로 콘솔을 통해 프레임과 시간을 출력해보자.

 

우선 Window의 헤더파일이 필요하다.

LARGE_INTEGER 자료형과 QueryPerformanceFrequency,QueryPerformanceCounter 함수를 사용하기 위함.

 

QueryPerformanceFrequency함수와 QueryPerformanceCounter는 높은 정밀도의 시간을 구하기 위해서 사용된다.

QueryPerformanceFrequency함수는 초당 진동 수(고정된 값)를 알아오고 (초반에 한번만 얻어오면 됨)

QueryPerformanceCounter함수는 현재 카운터를 알아온다.

 

코드

// Test.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//

#include <iostream>
#include <Windows.h>
using namespace std;

LARGE_INTEGER frequency;
LARGE_INTEGER cur;
LARGE_INTEGER prevFrame;
float deltaTime,fps,fpsTime,Time;
int fpsCounter;
void Timer()
{
    QueryPerformanceCounter(&cur); // 현재틱

    // 델타타임 구하기. 이전 프레임과 현재프레임간의 경과시간. 1초에 100fps라면 100분의 1 -> deltaTime
    deltaTime = (cur.QuadPart - prevFrame.QuadPart) / static_cast<float>(frequency.QuadPart); 
    Time += deltaTime;
    prevFrame = cur; // 이전틱 현재틱으로 변경

    // 프레임 구하기
    ++fpsCounter;
    fpsTime += deltaTime;
    if (fpsTime >= 1.0f) // 1초가 지났다면
    {
        fps = fpsCounter; // 프레임
        fpsCounter = 0;
        fpsTime = 0.0f;
    }
    std::cout << "프레임 :" << fps << " " << "현재시간 : ";
    std::cout << Time << std::endl;
}

int main()
{
    QueryPerformanceFrequency(&frequency); // 한번만 읽어들이면 된다.
    QueryPerformanceCounter(&prevFrame); // 이전틱 기억
    while (true)
    {
        Timer();
    }
}

 

 

 

반응형

'게임프로그래밍' 카테고리의 다른 글

비트 플래그와 비트 연산  (0) 2021.09.20
배달맨 게임코딩  (0) 2021.09.18
Comments