(유니티)최적화 방법 정리

티원·2025년 11월 11일

최적화 방법들

  1. 오브젝트 풀 패턴을 이용하여 Instantiate와 Destroy가 너무 반복되지 않도록
  2. 거리 측정 시 SqrMagnitude 사용.
  3. LOD(Level of Detail, 카메라가 멀리가면 모델을 간략화해서 최적화)
  4. 옵저버 패턴 사용 (Update문에서 매번 호출하지 않고 필요할때만 호출)
  5. 옵저버패턴에서 이벤트 구독시 반드시 해제 (메모리 관리, OnEnable과 OnDisable에서)
  6. 움직이지 않을 객체는 Inspector창에서 오른쪽위 Static 체크
  7. 그림자/빛 최적화
  8. 빛 연산 최적화1. Directional Light 사용, 빛이 확산되지않고 일직선상으로 진행되어 연산 최소화
  9. 빛 연산 최적화2. Bake 사용. 움직이지 않는 물체의 경우 빛을 미리 적용시켜둔다
  10. 그림자 연산 최적화1. 그림자 끄기 (오브젝트에서 Mesh Renderer - Lighting - CastShadows - off)
  11. 그림자 연산 최적화2. 다른 오브젝트의 그림자 표시여부(Receive Shadow on/off)
  12. 파티클StopAction으로 재생이 끝나면 Disable/Destroy 여부를 선택하여 최적화 가능
  13. OverlapSphere를 쓸때 nonAlloc사용, 코루틴으로 체크 : Overlap 정리영상 링크
  14. 프로그램 빌드전 Debug.Log를 전부 주석 혹은 코드로 처리 (프로파일러로 보면 CPU사용량점유함)
  15. 2D타일맵 콜라이더가 각각 있을필요없으므로 Composite Collider 사용

UI 성능 최적화

https://unity.com/kr/how-to/unity-ui-optimization-tips
위에있는 링크글 정리 (유니티 공식 UI 최적화 방법)

  1. 가능하면 UI를 하나의 캔버스로 묶되, 갱신이 빈번한 UI는 별도 캔버스로 분리
    예) HUD, 버튼, 텍스트 등은 한 Canvas 안에, HP바, 점수, 스킬 쿨타임 등 자주 변하는 UI는 별도 캔버스

  2. 레이캐스트 타겟 비활성화
    UI에 레이캐스트가 안들어간다면 레이캐스트 끄기
    UI에서 Raycast를 감지해서 처리하지않으면 옵션 해제. 어짜피 UI요소를 무시하고 오브젝트를 선택해야할때도 꺼야한다
    ▼ 아래 그림처럼 Canvas Graphic Raycaster 설정으로 하위 요소들을 전부 끌 수 있고

    ▼ 각각의 UI요소만 레이캐스트 끄게 가능하다

  3. 화면에 실제 보여지는 UI만 렌더링하도록 최적화
    UI요소를 오브젝트 풀 만들어서 재사용하게 하고, UI끼리 뒤에 가려져서 안보이는 것들은 렌더링 안하도록 처리(SetActive(false) 인듯)

  4. 레이아웃 그룹 사용 지양
    (쓸때는 써야할듯. 레이아웃 그룹 안쓰면 코드로 지정하라는데.. 난이도 있어보임)
    레이아웃 그룹 안의 UI요소가 변경되면 다시 그룹안의 요소들이 GetComponent 호출이 발생되며 재배치 하는 과정을 수행하기 때문에 성능이 떨어짐 (CPU 부담이 크다고한다)

  5. UI오브젝트 풀을 사용하고 반납할때 SetActive(false)처리 필수

  6. 캔버스를 숨기는 방법은 컴포넌트 자체를 비활성화 하기(SetActive(false))

  7. UI에 Animator를 붙일때는 신중하게
    (UI에 Animator 써본적이 없어서 아직은 모르겠음)
    UI에 Animator 컴포넌트가 붙어있으면 매프레임 Canvas를 확인

  • 항상 변경되는 UI요소(HP바, 로딩게이지, 스코어)에만 애니메이터를 배치
  • 일시적인 버튼, 메뉴, 이벤트등은 안쓴다.
  1. 화면을 가득 채우는 전체화면일때 필요 없는 요소를을 없앤다
    (완벽하게 이해가 안되었음)
    일시정지 상태일때 TimeScale을 0으로 한다고해도 UI는 계속 렌더링되고있다.
    그렇기 때문에 계속 렌더링 안되도록 UI도 종료시켜주면 성능이 향상될 수 있다고한다
    그런데 UI를 어떻게 종료시켜주는지?? 이거는 모르겠음 SetActive 하라는건가? SetActive(false)했다가 일시정지 풀리면 다시 SetActive(true)로 했을때 제대로 동작하는지 확인 필요함

0개의 댓글