- 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 다음글이전글이전 글이 없습니다.댓글