Games/Godot Engine

#Chapter.13 - 프레임과 델타타임을 활용한 움직임

Ermael Starius 2022. 6. 21. 13:00

 

 

델타타임(Delta Time): 이전프레임 시작시간과 현재프레임 시작시간의 차이.

 

프레임(Frame): Update() 함수에 의해 연속적으로 호출되는 정지된 하나의 화면.

 

FPS(Frame Per Second): 1 초당 보여주는 정지된 화면의 장 수. (흔히 30 FPS, 60 FPS 등등)

 

 


 

 

만일 각각의 클라이언트에서 프레임이 다르게 나타난다면?

 

각각의 컴퓨터마다 서로 다른 위치값을 갖게 된다. 따라서 게임을 프레이 하는동안 오류가 발생하게 됨.

이것을 해결하기 위해 델타타임(Delta Time)을 활용한다.

 

 

오류 예시 각각의 클라이언트 함수 처리 5s 동안 이동 결과 값
컴퓨터 A ( FPS = 30 ) 1 프레임 당 +10 이동 30×10×5 = 1500
컴퓨터 B ( FPS = 60 ) 60×10×5 = 3000

 

 

위 표에서 이동 결과값이 1500과 3000으로 엄청난 차이을 보임.

 

 

해결책 각각의 클라이언트  함수처리 델타타임 (Delta Time) 5s 동안 이동 결과값
컴퓨터 A ( FPS = 30 ) 1 프레임 당 +10 이동 1/30 = 0.0333 30×10×0.0333×5 = 50
컴퓨터 B ( FPS = 60 ) 1/60 = 0.0166 60×10×0.0166×5 = 50

 

 

따라서 델타타임(Delta Time)을 이용해서 문제를 해결하면 이동결과 값이 같게 나온다.

 

[ 델타타임(Delta Time): 1프레임을 처리하는데 걸리는 시간. ]

 

 

 


< 사용된 Key Word >

 

「 const MAX_SPEED = 100 」 - 속력의 최댓값을 상수로 고정시킴.

 

 

 

 

 

#현재 노드의 타입을 상속받음.
extends KinematicBody2D


#속도변수 velocity 를 기본값으로 초기화시킴.
var velocity = Vector2.ZERO

 

#속력의 최댓값을 상수 100으로 고정시킴.
const MAX_SPEED = 100

 


#상하좌우 움직일 시, 속도 3으로 움직임. 키입력 없을 시 정지상태.
func _physics_process(delta):
      #새로운 속도변수 초기화.
      var input_vector = Vector2.ZERO

      #새로운 속도는 (오른쪽에서 왼쪽의 값을뺀 정도 / 아래에서 위를 뺀 정도) 이다.
      input_vector.x = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left")
      input_vector.y = Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up")

      #새로운 속도가 0이 아닐때 "기존속도 = 새로운속도" / 새로운 속도가 0일때 "기존속도 = 0".
      if input_vector != Vector2.ZERO:
            velocity = input_vector
      else:
            velocity = Vector2.ZERO


      #이동처리함수. 해당 파라미터의 입력값 만큼 이동시킴. 이때, 델타타임(Delta Time)과 최대 속력을 곱해준다.
      move_and_collide(velocity * delta * MAX_SPEED)