얼마전, FPlatformTime::Second() 에 대해 이야기했었는데, 이 기능에도 문제가 있었다.
아직 정확히 알아보진 못했지만 시간이 많이 쌓이면 갱신간격이 2초로 늘어나는 것이다.
작업때문에 2,3일씩 컴퓨터를 그대로 켜놓기도 하기때문에 시간이 쌓이는건 쉬운 일이었다.
긴 시간을 체크할 목적이라면 상관없겠지만 총을 연사하기 위한 기능이라 2초는 너무 긴 간격이다.
그래서 결국은 FTimerHandle로 돌아왔다. 저번에 도트데미지를 위해 사용했을땐 연속사용할 때 계속 오류가 나서
되도록 피하고싶었는데 막상 사용하니 문제없이 작동했다. 그 이유또한 알아봐야겠다.
1. FPlatformTime::Second()가 2초(2048ms)마다 갱신된 이유
- 정확한 원인은 알려진게 없고, 추측하기론 성능 최적화를 위해 또는 CPU시스템 설정때문에 시스템 자체에서 SecondPerCycle같은 변환상수를 일정 시간 간격(이 경우엔 2048ms)마다 갱신한다.
더 세밀하고 연속적인 시간 측정이 필요하다면 FPlatformTime::Cycles()를 직접 사용하는 방법을 사용해 볼 수 있다.
2. 도트데미지 사용 오류가 발생한 이유
- 정확한 오류 내용은 독 도트 데미지를 1초마다 8초동안 적용하는 거였는데, 첫번째 독에 걸리고 끝난 후 두번째 독 아이템에 맞으면 무한 도트 데미지가 적용되는 것이었다. 한참을 씨름하다 8초를 줄여봤는데 신기하게도 다른 시간설정에선 정상 작동했다.
그래서 이유를 알아보니, 이것 또한 FPlatformTime::Second() 와 관련이 있었다..
FTimerHandle도 알고보니 FPlatformTime::Second() 를 사용한다. 그래서 두 기능의 캐시값이 서로 맞물리면 그런 오류가 발생할 수도 있다고 한다.
분명 시스템에선 FPlatformTime::Second() 를 유용하게 사용중인것 같은데 왜 나랑만 만나면 악연을 이루는지 모르겠다..
유용하게 써보기 위해 친해져보도록 해야겠다.
무기는 많을수록 좋으니까
'게임 개발 공부 > 언리얼엔진' 카테고리의 다른 글
| UE5 | c++ - ProjectileMovement->SetUpdatedComponent() (0) | 2025.02.24 |
|---|---|
| UE5 | C++ - Projectile (0) | 2025.02.21 |
| UE5 | C++ - FPlatformTime::Seconds(); (0) | 2025.02.17 |
| UE5 | C++ - FTimerHandle (0) | 2025.02.13 |
| UE5 | C++ 개발학습 - 인터페이스 (0) | 2025.02.12 |