본문 바로가기

게임 개발 공부/언리얼엔진

UE5 | C++ - FPlatformTime::Seconds();

저번에 Tick()을 대체할 기능으로 FTimerHandle을 언급했는데, 이 기능에도 문제는 있었다.

연속으로 타이머가 생성될 경우 부하가 생길 가능성이 크다는 것이다.

너무 짧지않은 간격으로 기능을 실행하는 것엔 적합하지만, 아주 짧은 간격으로 타이머를 생성하면 크러시까지 발생한다.

 

이를 대체할 또다른 기능은 윈도우 API에서 제공하는 GetTickCount()다.

이 기능은 윈도우가 부팅된 순간부터 1ms단위로 시간을 측정한다. 이 함수를 이용하면 엔진부하를 줄이면서 Tick과 유사한 기능을 사용할 수 있다. 그러나 이 기능의 최대 측정시간은 49.7일이기에, 이 날짜가 지나면 0으로 초기화된다. 만에하나 내가 필요한 측정시간 사이에 초기화가 되면 측정값이 날아버린다.

 

이를 보완할 수 있는 기능이 GetTickCount64()이다.

이 기능은 32비트 기반이라서 발생하는 기존 기능의 49.7일의 한계를 64비트 기반으로 5억년이 넘는 시간으로 늘려준다.

사실상 인류가 살아있는 동안 리셋 될 일이 없을 것이다.

 

허나 이 기능에도 약점은 있다. 윈도우즈 API기능이기에, 멀티플렛폼 지원이 불가능하다.

 

그래서 최종적으로 사용하게 된 기능이 바로 FPlatformTime::Seconds()이다.

이 기능은 언리얼엔진에서 제공하는 플랫폼 독립적인 타이머 함수이다.

게임 실행 이후 경과한 시간을 초(Second)단위로 반환하며, 플랫폼에 관계없이 일관된 시간값을 제공한다.

 

 

헤더와 사용

#include "HAL/PlatformTime.h"

double CurrentTime = FPlatformTime::Seconds();

 

 - 반환값은 초단위이다 (1.54sec, 2.3sec)

 - 1000을 곱해주면 밀리초 단위로 사용할 수 있다.

 

실제 사용

	CurrentAttackTime = (float)FPlatformTime::Seconds();
	float AttackElapse = CurrentAttackTime - LastAttackTime;
		
	bIsCoolTimeEnd = AttackElapse >= AttackRate ? true : false;
    
    if (bIsCoolTimeEnd)
{
	if (AttackSound)
	{
		UGameplayStatics::PlaySoundAtLocation(GetWorld(), AttackSound, FVector::ZeroVector);
	}

	LastAttackTime = (float)FPlatformTime::Seconds();
}

 

'게임 개발 공부 > 언리얼엔진' 카테고리의 다른 글

UE5 | C++ - Projectile  (0) 2025.02.21
UE5 | C++ - FPlatformTime::Second() (2)  (0) 2025.02.19
UE5 | C++ - FTimerHandle  (0) 2025.02.13
UE5 | C++ 개발학습 - 인터페이스  (0) 2025.02.12
UE5 학습 - DataTable  (1) 2025.02.07