[🖥️Project: HoP] #3 애니메이션 시스템과 O(1) 최적화

2025. 12. 8. 22:45·도토리도굴단/Project: HoP 개발일지

🚀 오늘의 작업 요약

  • 애니메이션 시스템: 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를 높이는 게 목적이 아니다.

  1. GC 스파이크 방지: 사용자가 타자를 칠 때마다 로직이 돌 텐데, 가비지가 쌓여 GC가 도는 순간 위젯이 '움찔'거리면 사용자 경험을 크게 해친다.
  2. 백그라운드 앱의 에티켓: 사용자는 햄초를 켜두고 고사양 게임이나 작업을 할 것이다. 내 앱이 시스템 리소스를 0.01%라도 덜 쓰는 것이 '데스크탑 위젯'으로서의 예의다.
  3. 확장성: 나중에 햄초 스킨이나 상호작용이 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
'도토리도굴단/Project: HoP 개발일지' 카테고리의 다른 글
  • [🖥️Project: HoP] #5 무한 점프 시스템
  • [🖥️Project: HoP] #4 Windows Low-Level Hook과 전역 입력 감지
  • [🖥️Project: HoP] #2 위치 저장과 멀티 모니터
  • [🖥️Project: HoP] #1 투명 윈도우와 위젯 시스템 구축
happy124219
happy124219
happylaboratory 님의 블로그 입니다.
  • happy124219
    윤아 실험실
    happy124219
  • 전체
    오늘
    어제
    • 분류 전체보기 (116)
      • 공부방 (103)
        • Unity UI (2)
        • C# 알고리즘 (3)
        • C# 에러발생 로그 (7)
        • 내일배움캠프 Unity 9기 TIL (91)
      • 도토리도굴단 (9)
        • Project: HSR 개발일지 (3)
        • Project: HoP 개발일지 (6)
      • 개인 프로젝트 (1)
        • Project: BloomFolk (1)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    내일배움캠프후기
    도망개발일지
    Unity게임개발
    도망공부일지
    유니티트랙후기
    유니티
    내일배움캠프
    c#문법
    스파르타내일배움캠프
    스파르타내일배움캠프TIL
    게임개발
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
happy124219
[🖥️Project: HoP] #3 애니메이션 시스템과 O(1) 최적화
상단으로

티스토리툴바