-'프로젝트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가지 (다음 액션)
- Deep Profile 끄고 측정
- Deep Profile은 오버헤드가 커서 스파이크를 과장할 수 있음.
- CPU Usage → Timeline/Hierarchy에서 스파이크 프레임 1~2개 찍어서 원인 확인
- 스파이크 프레임에서 상위 항목이 보통:
- Physics2D.* (Overlap/Contact/Simulation)
- Scripts (GetComponent 반복, LINQ/foreach 박싱, 이벤트 폭주)
- GarbageCollector (할당/수거)
- UI/TextMeshPro (데미지 텍스트, 레이아웃)
중 어디인지가 핵심.
- 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.투사체 데미지 적용 테스트
현재 미진행된 리팩토링들이 많다 빨리 진행해야된다.
'인디게임개발 > 프로젝트L' 카테고리의 다른 글
| [2026.03] 대화시스템 구성 -> 스크립트 역직렬화 중 Regax 오류 ( 소수값 Regax 오류) (0) | 2026.03.19 |
|---|---|
| [2026.03] 키워드 메모 (0) | 2026.03.14 |
| [2026.03] 대화플로우 작업 진행도 근황 및 TIL (0) | 2026.03.13 |
| [2026.03] 3월 마일스톤 계획 (0) | 2026.03.13 |
| [2026.02] 프로젝트L 2월 작업 근황 : 전투 1차 최적화 리팩토링 및 기타 작업 (0) | 2026.03.13 |
