내일배움캠프

내일배움캠프 Unity - TIL : 25.03.25

달시_Dalsi 2025. 3. 25. 21:51
728x90

오늘 학습한 내용

1) 코루틴 new 키워드 사용 줄이기

  • yield return new WaitForSeconds(1f);를 반복적으로 호출하면 매번 새로운 객체를 생성하여 GC(가비지 컬렉션) 부담이 증가
  • WaitForSeconds 객체를 미리 선언하고 재사용하는 방식으로 최적화 가능

 

2) 연산 순서 고려하기

  • 벡터 연산과 스칼라 연산을 혼합할 때 연산 순서가 성능에 영향을 줄 수 있음
  • speed * Time.deltaTime * dir 방식이 dir * speed * Time.deltaTime보다 연산 효율이 높음
  • 스칼라 연산을 먼저 수행하고 벡터 연산을 나중에 실행하는 것이 성능에 유리함

문제 및 해결 과정

1) 문제 (코루틴을 사용할때 성능 저하 문제)

 

 

  • yield return new WaitForSeconds(1f); 방식으로 코루틴을 실행하면 매번 새로운 객체가 생성
  • GC(가비지 컬렉션) 부담이 증가하여 불필요한 메모리 할당과 해제가 반복적으로 발생

 

 

 

시도한 해결 방법

new (WaitForSeconds)객체를 미리 선언하여 반복적으로 재사용하는 방식으로 변경

private WaitForSeconds waitForOneSecond = new WaitForSeconds(1f);

IEnumerator SomeCoroutine() {
    while (true) {
        Debug.Log("코루틴 실행 중...");
        yield return waitForOneSecond; // 캐싱한 객체 재사용
    }
}

 

결과

 

  • GC 할당이 줄어들고 성능이 향상됨
  • 불필요한 객체 생성을 방지하여 메모리 사용을 최적화할 수 있었음

 

 

 

 

2) 문제 (연산 순서에 따른 성능 차이)

 

  • 연산 순서에 따라 불필요한 벡터 연산이 추가로 발생
  • dir * speed * Time.deltaTime 방식은 벡터 연산이 먼저 수행되어 성능이 저하될 가능성이 있음

 

 

 

시도한 해결 방법

아래 두 개의 코드 비교

// 방법 1
transform.position += dir * speed * Time.deltaTime;

// 방법 2
transform.position += speed * Time.deltaTime * dir;
  • dir * speed * Time.deltaTime → 벡터 연산이 먼저 수행됨
  • speed * Time.deltaTime * dir → speed * Time.deltaTime는 스칼라 연산이므로 더 빠름
  • 연산 비용을 줄이기 위해 스칼라 연산을 먼저 수행하고 벡터 연산을 나중에 실행하는 것이 바람직함

 

결과

불필요한 연산을 줄여서 성능을 개선할 수 있었음

 


새롭게 알게 된 점

  • 코루틴에서 new(예.WaitForSeconds)를 캐싱하여 불필요한 객체 생성을 방지하는 것이 최적화에 효과적
  • 연산 순서를 최적화하면 불필요한 계산을 줄이고 성능을 향상시킬 수 있음
  • 최적화는 무조건 적용하는 것이 아니라, 프로젝트 상황에 맞게 신중하게 결정해야 함

 

728x90