TIL

26.02.25일자 - TIL

csh8696nb 2026. 2. 25. 20:54

ACK, 팀프로젝트

 

X좌표와 Y좌표를 반대로 계산해서 한번 오류가 났다.

(가로가 Y고 세로가 X인거 개킹받네)

예상대로 움직이는 방향을 X, Y가 아닌 Y, X로 전환해 주니 정상적으로 동작하는 것을 확인할 수 있었다.

==========

1. ApplyDamage가 제대로 동작하지 못하는 것으로 보인다.
2. Friction(마찰력) 계수를 증가시켜 줬음에도 적당히 감속하지 못하는 문제가 있다.

2 -> SetLinearDamping(1.f)로 상시 감속을 부여할 수 있다.

크아악 트러블 슈팅~


=====
'3번째' 리스타트에서 '자주' 크래시가 발생한다. (아니었음)
호출 스택도 보이지 않는다.

주석 처리된 부분이 크래시가 나는 부분이라는 힌트이다. (다만 GC오류라면 알기 어려울 수 있다.) 
AActor::GetWorld(void)const; (?)
FLogCategoryLogSpawn LogSpawn

#pragma optimize("", off)
#pragma optimize("", on)

리스타트의 전과 후의메모리가 다른 것에서 터지는 것으로 보인다.  (높은 확률로 포인터 쪽)

패키지 로드(?)

발사체?
메모리는 컨테이너 관련으로 접근하면 확률이 높다.

GC를 꺼서 확인해 보는 방법 / 디버깅 모듈을 죄다 키는 방법 이 있지만 이 방법으로는 해결하지 못했다.

gc.VerifyObjectsDestroyed 1

필살기 -> 터지지 않던 이전 버전을 찾아서 돌아가기
develop을 기준으로(그렇게 관리 중 이니까) 전 버전으로 되돌아가면서 문제가 발생하지 않는 버전을 찾는다.

터지지 않는 구간을 찾았고 그 다음 커밋이 범인임이 거의 확정되었다. 

clode (얘도 결국 못 찾았다)
총알로 사용했던 projcetile이 범인으로 보인다.

lamda

Add/
생명 주기 Lifecycle
/Remove

객체가 생성돼서 소멸하는 주기
객체가 LifeCycle이 다했는데 접근을 하는 문제가 생길 수 있다.

타이머 핸들이 지역변수
핸들이 죽고 나면 저 타이머를 영원히 끌 수 없게 된다.

New - Delete / 생성 관련된 처리가 됐다면 반드시 소멸 관련된 처리를 생각해줘야 한다.

* this는 nullptr 자체가 불가능하다.
Self = TWeakObjectPtr(this)
self.IsValid()  

*1  TMap / TArray - 포인터가 연결이 되었다면 소멸하는 시점에 연결을 반드시 끊어줘야 한다. 
*2  GC 때문이다. - Destroy는 바로 소멸 시켜주지 않는다.
Mark & Sweep 
보통 개똥 같은 접근 오류면 Destroy

권장 되는 패턴
SetTimer를 걸었다면
객체가 소멸하는 시점에 RemoveTimer를 호출하자

또 하나 그냥 알아두면 좋은 것
RawPointer에 대한 위험성 -> TWeakObjecPtr의 IsValid함수로 사용 

캡처에서 [this, & ]는 피하는 것이 좋다.
ensure / valid
==
문제가 생겼던 구문은
ShootingmachineComponent의 91 DoFire() 함수 내에서 총알 projectile을 생성하면서 생겼다.(130~134줄)

Set TimerHandle 을 하고 해제를 하지 않은 상태로 Destroy()에 들어가고 있었고 Destroy()함수는 GC가 작동하는 순간에 호출되므로 중복 호출이 되더라도 즉시 알 수 있는 방법이 없다.(UE의 단점)

당연히 빈 포인터를 다시 호출하는 형태가 되면 크래시로 터진다.
===

'TIL' 카테고리의 다른 글

26.02.27일자 - TIL  (0) 2026.02.27
26.02.26일자 - TIL  (0) 2026.02.26
26.02.24일자 - TIL  (0) 2026.02.24
26.02.23일자 - TIL  (0) 2026.02.23
26.02.20일자 - TIL  (0) 2026.02.20