Yield 캐싱 전 코드
오늘의 문제
플레이어가 공격을 하고, 트리거 콜라이더를 여러번 On / Off 하여 다단 히트 데미지를 주는 메서드이다.
그런데IEnumerator를 사용하는 코루틴에서new WaitForSeconds를 반복적으로 사용하면, 각 반복마다 새로운 WaitForSeconds 인스턴스가 생성된다.
(다단 히트 공격이고 전투가 빈번하기 때문에 그만큼 생성되는 인스턴스도 많았던 것이다.)
이렇게 반복적으로새로운객체가 힙에 할당되고, 이 객체들은 나중에 GC(가비지 컬렉터)에 의해 정리 되는데, 성능에 민감한 환경에서는 이를 캐싱하여 최적화 하는게 중요하다.

방법은 간단했다.
코드를 수정하여 WaitForSeconds 인스턴스를 반복문 바깥에서 한 번만 생성하고 WaitForSeconds JumpHitDuration = new WaitForSeconds(0.1f);, 인스턴스를 반복문 내에서 재사용함으로써, 반복할 때마다 새로운 인스턴스를 생성하는 것을 방지하였다.
이렇게 간단한 기법만으로도 메모리 할당과 가비지 컬렉션의 부담을 줄일 수 있다.
메모리 할당과 해제는 성능에 큰 영향을 미친다.
new WaitForSeconds(0.1f)가 반복문 내에서 호출될 때마다, 새로운 객체가 힙에 할당되고, 이 객체들은 나중에 GC에 의해 정리되는데, GC가 작동하면 게임의 프레임 등이 순간적으로 떨어질 수 있어, 특히 실시간으로 반응성이 중요한 게임에서는 이를 최소화하는 것이 중요할 수 있다고 한다.
IEnumerator도 캐싱할 수 있다. 코루틴 내에서 다른 코루틴을 호출하는 구조에서, 호출되는 코루틴을 미리 생성해두고 필요할 때 재사용함으로써 IEnumerator의 생성 비용을 아낄 수 있다.
주로 반복적으로 같은 코루틴을 호출해야 할 때 유용하며, 메모리 할당 및 가비지 컬렉션의 부담을 줄일 수 있습니다.