-'프로젝트L' 리팩토링 중 Unit Status 시스템 수정 중, 

Dirty Flag Pattern 이라는것을 알게됨, 정리 해야됨

 

- 프로젝트L의 전투 플로우 구현 중에 프레임 드랍이 심각하게 발생

 

프레임 드랍 발생 상황은

*2D 도트게임

*플레이어 유닛 객체1개 + 보조 유닛 1개

*적 객체 60 개 

*쓰러트린 적들 객체로 나오는 경험치 구슬 5~10개

*전투 테스트를 하기위해 몬스터 웨이브가 접근하고 적 전투중 문제 발생

해당 상황 전체를 찍지는 못했고 , 프레임이 0을 찍는 구간에서만 프레임이 왜 튀는지 체크를 해봤다

튀는 곳의  수치를 확인해보면 Bodies 61개인데 ,Physics2D 충돌이 3620번이 찍혔다.

보통 한 프레임다 100~300개의 충돌을 정상 범주에 두고 500~800개를 약간 무겁다고 표현하는데

3000개를 넘어버렸따.

 

유닛 객체마다 콜라이더를 여러개를 들고 있었고 (피격용,물리용,공격용,탐색용)

각 스킬객체마다 탐색 루프를 돌리기도 했으며 (유닛이 레벨업을 하며 스킬을 획득하면서 더욱 늘어남)

심지어 감지 및 공격의 대부분이 Trigger를 이용해서 루프를 돌리고 있었다.

 

리팩토링 방향으로 감지 및 공격관련 을 RayCast 및 OverlapCircleNonAlloc을 사용하여 리팩토링하기로 결정하였다.

 

리팩토링 진행중 최적화가 잘 되었는지 프로파일러를 사용하여 확인결과

상황은

*플레이어 유닛 객체1개  (플레이어는 범위형 공격을 반복 실행)

*적 객체 60 개 

프레임이 많이 안정화 된거를 볼 수 있다.

 

해당 방향으로 계속 리팩토링을 진행을 해도 될것 같다.

GC는 여전히 조심해야 될것 같다.

 

현재 조금씩 튀는 스파이크를 잡기위한 GPT 조언

더보기

이 상태에서 꼭 확인해야 할 3가지 (다음 액션)

  1. Deep Profile 끄고 측정
  • Deep Profile은 오버헤드가 커서 스파이크를 과장할 수 있음.
  1. CPU Usage → Timeline/Hierarchy에서 스파이크 프레임 1~2개 찍어서 원인 확인
  • 스파이크 프레임에서 상위 항목이 보통:
    • Physics2D.* (Overlap/Contact/Simulation)
    • Scripts (GetComponent 반복, LINQ/foreach 박싱, 이벤트 폭주)
    • GarbageCollector (할당/수거)
    • UI/TextMeshPro (데미지 텍스트, 레이아웃)
      중 어디인지가 핵심.
  1. GC Alloc이 0에 가까운지
  • 전투 루프에서 GC Alloc이 계속 생기면 평균은 괜찮아도 스파이크가 나온다.

 

“준수” 판정 기준 제안

  • 목표 60FPS면 프레임 예산이 16.6ms
  • 지금처럼 평균이 16 근처면 헤드룸이 거의 없음
  • 실전(이펙트/드랍/AI/사운드) 얹으면 쉽게 20ms 넘어감

그래서 “평균 12ms대 + 스파이크 제거” 정도가 체감 안정권.

 

- 현재 프로젝트L 리팩토링 진행 상황

1.Unit에 몰려있던 컴포넌트 구조 SPR 원칙으로 분리 중

 

2.Manager 및 Controller 역할 분배 및 각각 의존성 줄임

Manager : 유닛의 활성화,비활성화,데이터 관련

 ㄴController : 유닛의 조작 및 캐릭터 연출 관련 

 

3.범위 공격의 데이터를 구조체화 하였고 또한 적의 공격의 탐색 하는 기능을 Trigger -> OverlapCircleNonAlloc으로 변경

4.Status와 BuffDebuff System을 통하여 실제 스탯 증감 버프 적용 테스트 완료 

 

5.투사체 데미지 적용 테스트

 

현재 미진행된 리팩토링들이 많다 빨리 진행해야된다.

+ Recent posts