🚀 오늘의 작업 요약
- 애니메이션 시스템: Idle → Charge → Up → Fall로 이어지는 상태 머신 및 시퀀스 구현.
- 구조적 최적화: String 비교와 선형 탐색을 제거하고 Hash와 Dictionary 캐싱 도입.
- 정밀 제어: WaitForSeconds를 버리고 AnimatorStateInfo 기반의 프레임 단위 동기화 구현.
위젯이 화면에 가볍게 떠 있으려면 지금까지 흐린눈해왔던 최적화 작업을 해야 한다..
🛠 구현 상세
1. 애니메이션 시퀀스 구조 (State Machine)
햄초의 반응성을 높이기 위해 클릭 상호작용에 따른 애니메이션 흐름을 설계했다.
- 기본 상태 (Idle): 평상시 상태.
- 충전 상태 (Charge): 입력 스택이 가득 차면 햄초가 몸을 웅크리며 준비 자세를 취한다.
- 반응 시퀀스 (Up/Fall): Charge 상태에서 클릭 시, Up(점프) → Fall(착지) → Idle로 이어지는 시퀀스가 자동으로 진행된다.
- 흐름 제어: 애니메이션 진행 중에는 중복 클릭을 무시하도록 isAnimating 플래그를 두어 로직 꼬임을 방지했다.
2. 정밀한 타이밍 제어 (Sync Reliability)
기존의 WaitForSeconds(clip.length) 방식보다 코루틴 내에서 AnimatorStateInfo를 매 프레임 확인하는 방식으로 변경했다.
// 정확한 타이밍 체크 로직
while (true)
{
AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(BASE_LAYER_INDEX);
// 현재 상태가 아니거나, 진행도가 1.0(끝)을 넘어가면 루프 탈출
if (stateInfo.shortNameHash != targetStateHash || stateInfo.normalizedTime >= 1.0f)
break;
yield return null;
}
이 방식은 렉이 걸려도 애니메이션 진행도(normalizedTime)를 기준으로 판단하기 때문에 로직이 절대 꼬이지 않는다.
⚡ 성능 최적화: 왜 O(n)을 O(1)로 바꿨는가?
매번 애니메이션을 재생할 때마다 발생하는 불필요한 연산을 제거했다.
1. StringToHash & Dictionary 캐싱
Unity의 Animator.Play("String")이나 List 순회 탐색은 매 호출마다 미세한 가비지(Garbage)를 생성할 수 있다.
- Before: 매 호출 시 문자열 해싱 & 선형 탐색 발생 (GC 유발 가능성).
- After: Start()에서 미리 계산된 int 해시값과 Dictionary 조회로 변경.
📊 성능 분석 (Reality Check)
최적화 적용 전후를 비교해 보았다. 수치적인 속도 향상보다 '안정성'에 주목했다.
| 항목 | 최적화 전 | 최적화 후 | 개선 효과 |
| 클립 검색 | ~11회 문자열 비교 | 1회 Dictionary 조회 | ~11배 속도 향상 |
| GC 할당 | String 연산으로 발생 가능 | 0 (Zero Allocation) | GC Spike(렉) 방지 |
| 타이밍 | ±수 프레임 오차 | ±1 프레임 | 프레임 드랍 시에도 동기화 보장 |
💡 왜 이 최적화가 중요한가?
FPS를 높이는 게 목적이 아니다.
- GC 스파이크 방지: 사용자가 타자를 칠 때마다 로직이 돌 텐데, 가비지가 쌓여 GC가 도는 순간 위젯이 '움찔'거리면 사용자 경험을 크게 해친다.
- 백그라운드 앱의 에티켓: 사용자는 햄초를 켜두고 고사양 게임이나 작업을 할 것이다. 내 앱이 시스템 리소스를 0.01%라도 덜 쓰는 것이 '데스크탑 위젯'으로서의 예의다.
- 확장성: 나중에 햄초 스킨이나 상호작용이 100개로 늘어나도 O(1) 구조에서는 성능 저하가 없다.
🔮 다음 계획
햄초가 움직일 수 있게 되었으니 이제 스택을 쌓아야 한다.
- Global Input Hook System: 윈도우 전역 키보드 이벤트를 훅(Hook)하여, 사용자가 타이핑하는 양만큼 햄초 스택을 쌓는 기능을 구현할 예정이다.
💡 회고
각종 API에 최적화부터 시작하니까 뭐가 뭔지 하나도 모르겠다 어렵다.
'도토리도굴단 > Project: HoP 개발일지' 카테고리의 다른 글
| [🖥️Project: HoP] #5 무한 점프 시스템 (0) | 2025.12.13 |
|---|---|
| [🖥️Project: HoP] #4 Windows Low-Level Hook과 전역 입력 감지 (0) | 2025.12.11 |
| [🖥️Project: HoP] #2 위치 저장과 멀티 모니터 (0) | 2025.12.08 |
| [🖥️Project: HoP] #1 투명 윈도우와 위젯 시스템 구축 (0) | 2025.12.04 |
| [👾Project: PokeIdle] #1 투명 창 만들기 (0) | 2025.08.19 |