• 티스토리 홈
  • 프로필사진
    SiJun-Park
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
SiJun-Park
  • 프로필사진
    SiJun-Park
    • 분류 전체보기 (190)
      • Unity (148)
        • 출시 해보기 (Slime Company) (3)
        • 뱀서류 Project (34)
        • Defense Project (20)
        • FPS Project (30)
        • RPG Project (39)
        • 기타 - 개발 (22)
      • 개발 (35)
        • 임베디드 소프트웨어 (7)
        • 컴파일러 (6)
        • 기계학습 (8)
        • 보안 (8)
        • 그래픽스 (2)
        • 그 외 (4)
      • 코딩문제 (6)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • foreach / Animator 최적화 공부 기록
        2026년 01월 01일
        • SiJun-Park
        • 작성자
        • 2026.01.01.:31

        가끔 책을 읽거나 조언을 보면 foreach를 사용하는건 조금 줄여라! 

         

        이런 말이 많이 들려서, 왜 그러지? 라는 호기심에 공부를 해봤습니다.

         

        foreach문이 뭔가?

        foreach문은 컬렉션을 안전하고 읽기 쉽게 순회하기 위한 문법입니다.

        foreach (타입 변수 in 컬렉션)
        {
            // 컬렉션 안의 요소 하나씩 사용
        }

        위 처럼 배열 / 리스트 / 딕셔너리 같은 묶음 데이터에서 앞 -> 끝까지 하나씩 꺼내서 쓰는 문법입니다.

         

        장점으로는 인덱스 관리 실수가 없고 코드 가독성이 좋습니다.

         

        그럼 뭐가 문제인가?

        List와 Array는 GC가 거의 없지만 foreach는 LINQ와 같이 쓰면 GC 문제가 발생하고 

        속도가 느립니다. (무조건 느리진 않습니다)

         

        느린 경우를 보면

         

        배열 -> 문제가 없음

        List -> 대체로 괜찮음

        Dictionary -> 느림

         

        그렇기 때문에 Dictionary를 순회하는 것은 자제 하고, 또한 LINQ랑 사용하는 것은 피해야합니다.

         

         

        Animator는 뭐가 문제가 있나?

        animator.SetBool("IsMove", true);

        위 코드는 겉으로 보면 아주 단순합니다.

         

        하지만 Animator 입장에서는 절대 단순하지가 않습니다.

         

        내부적으론 "IsMove"라는 문자열 전달하게 되고 문자열 길이를 확인합니다

        그 후 문자 하나하나 순회를 하게 되고 해시 계산을 해서 해당 파라미터를 탐색하고

        값을 변경하게 됩니다.

         

        이 과정이 매 호출마다 반복이 됩니다.

         

        그러면 예로들어 몬스터 300마리가 있다하고 매 프레임 이동 체크를 한다고 하고 FPS는 60이라고 하겠습니다.

        300 * 60 = 초당 18,000번!!

        문자열 해시 계산만 18,000/초입니다.

         

        그러면 모바일 게임이나 웨이브 게임에서 체감이 확나기 시작합니다.

         

        그러면 어떻게 해결?

        static readonly int IsMove = Animator.StringToHash("IsMove");
        animator.SetBool(IsMove, true);

        위 처럼 해시 방식을 사용하면 됩니다.

         

        이 구조의 핵심은 String To Hash는 딱 1번만 실행을 하게 되고, 이후엔 그냥 int 비교를 하게 됩니다

         

        그러면 string 비교를 안하고 문자열 순회를 하지 않으며 해시 계산을 안하게 됩니다.

         

        즉 CPU 연산량이 차원이 달라집니다

         

        static readonly int IsMove = Animator.StringToHash("IsMove") 이렇겐 왜 쓰냐?

        왜냐하면 클래스 로딩 시 딱 1번만 합니다.

        그리고 모든 인스턴스가 공유가 되고 GC가 없고 재계산을 안합니다

         

        즉 1000마리 몬스터가 있다 해도 해시 계산은 딱 한번입니다.

         

        'Unity > 기타 - 개발' 카테고리의 다른 글

        Object Pooling 회고  (0) 2026.01.06
        람다식 / LINQ 회고  (0) 2026.01.06
        Transform 그리고 StopAllCoroutines 공부 기록  (1) 2026.01.01
        GetComponent 공부 기록  (0) 2025.12.30
        Coroutine 공부 기록  (0) 2025.12.30
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바