오르막길

[Unity] 쉽게 할 수 있는 최적화 팁들 (+추가 예정) 본문

문제 해결하기/Unity

[Unity] 쉽게 할 수 있는 최적화 팁들 (+추가 예정)

nanalyee 2025. 4. 28. 16:36

공부 배경

가시화 모니터링 테스트 중, 규모에 비해 과한 성능이 요구되는 것을 발견하고
비코드적인 면으로 여러 최적화 시도를 하게 되었습니다.
개발자 입장에서 코드 최적화도 중요하지만
그 외 쉽게 놓칠 수 있는 최적화 방법을 정리해 두고자 글을 작성하게 되었습니다.
앞으로도 놓쳤던 최적화 방법이 있다면 계속해서 추가할 예정입니다.

 

출처

유니티 공식 문서를 바탕으로 유니티 21.3.16f1 버전에서 적용 가능하도록 작성되었습니다.

 

 


목차
1. Occlusion Culling
2. Resources 폴더
3. Build Compression 설정 : WebGL

 

1. Occlusion Culling

다른 오브젝트에 가려(오클루전된) 카메라에 보이지 않는 오브젝트의 렌더링을 비활성화하는 기능

카메라가 비추는 범위만 렌더링한다

  • 3D 컴퓨터 그래픽스에서는 대부분의 경우 카메라에서 먼 오브젝트가 먼저 그려지고 더 가까이 있는 오브젝트를 차례차례 덮어서 쓰여집입니다. (=Overdraw)
  • 데이터는 런타임 시점에 각 카메라가 무엇이 보이고 무엇이 보이지 않는지 확인할 때 활용됩니다. 이런 정보를 바탕으로 Unity는 가시적인 오브젝트만 렌더링 하도록 합니다.
  • 결과적으로 드로우 콜 수가 줄고 게임의 퍼포먼스는 향상됩니다.

Occlusion Culling static 설정

  • Occlusion Culling을 적용할 모든 오브젝트는 인스펙터(Inspector)에서 오클루더 정적(Occluder Static)오클루디 정적(Occludee Static) 태그를태그를 붙여야 합니다.
  • 오클루디 정적(Occludee Static) : 다른 오브젝트를 가리지 않는 투명한 오브젝트와 작은 오브젝트
  • 오클루디 정적(Occludee Static)은 다른 오브젝트에 의한 Occlusion에는 고려되지만 그 자체가 Occluder는 아닌 것으로 간주돼 계산을 줄여줍니다.

Occlusion Culling 적용

  • Window - Rendering - 오클루전 컬링(Occlusion Culling)을 눌러 창을 엽니다.
  • 오클루전 영역을 생성하지 않으면 기본적으로 오클루전 컬링이 전체 씬에 적용됩니다.
  • Bake 탭으로 넘어가 프로퍼티 설정을 해줍니다.
  • Smallest Occluder : 다른 오브젝트를 가리는 가장 작은 오브젝트의 크기로, 해당 크기보다 작은 모든 오브젝트는 절대 다른 오브젝트를 가리지 않습니다.
  • Smallest Hole : 카메라가 보게 되어 있는 지오메트리 사이의 가장 좁은 간격을 나타내는 값으로, 카메라가 들여다봐야 하는 미세한 균열이 씬에 있다면 최소 구멍 값은 간격이 가장 좁은 크기보다 더 작아야 합니다.
  • Bakeface Threshold : 후면 테스팅을 통해 불필요한 디테일을 줄이는 데이터 크기 최적화를 사용합니다. 기본값은 100으로 양호하며 데이터셋에서 후면을 절대 제거하지 않습니다. 값이 5라면 가시적 후면이 있는 포지션을 근거로 데이터를 급격하게 줄입니다. 
  • 오클루전 컬링 데이터를 생성하려면 베이크(Bake) 버튼을 클릭합니다.

Bake 버튼은 우측 하단에 있습니다

 

 

2. Resources 폴더

리소스 폴더는 빌드된 Unity 플레이어의 에셋 컬렉션입니다.

  • Resources 폴더의 모든 에셋 및 종속성은 resources.assets_이라는 파일에 저장됩니다.
  • Resources 폴더에 있는 에셋만이 Resources.Load()를 통해 액세스 될 수 있습니다. 그러나 종속성을 지니고 있으면 더 많은 에셋이 “resources.assets” 파일에 포함될 수 있습니다.
  • 즉, Unity의 Resources 폴더는 사용 여부와 관계없이 빌드 시 모두 포함됩니다.
  • 필요하지 않은 리소스가지 메모리에 사용되어 초기 로딩 속도에 큰 영향을 미치는 주범입니다.
  • Resources 폴더 사용을 최소화하고, 필요한 경우 Addressables 등을 이용해 리소스를 명시적으로 관리해 줍니다.
  • 가장 중요한 건, 빌드 전 사용하지 않는 파일을 정리해 줍니다.
  • AssetBundle.Unload()를 호출해서 에셋 번들의 리소스를 언로드 할 수 있습니다. 
  • unloadAllLoadedObjects 파라미터에 true을 전달하면 에셋 번들에서 내부적으로 보유한 오브젝트와 
    AssetBundle.LoadAsset()을 사용하여 에셋 번들에서 로드된 오브젝트가 모두 삭제되고
    번들에 의해 사용된 메모리가 릴리스 됩니다.

 

 

3. Build Compression (빌드 압축) 설정 : WebGL

WebGL 빌드 압축 옵션
  • WebGL 플랫폼은 네트워크를 통해 모든 데이터를 다운로드해야 실행할 수 있습니다.
  • 따라서 빌드 시 압축 설정을 통해 데이터 전송량을 줄이고 로딩 시간을 단축할 수 있습니다.

  • File - Build Setting - Webgl - Player Settings - Publishing Settings 메뉴에서 설정합니다
  • Compression Format 설정을 Gzip 또는 Brotli로 설정합니다
  • Disabled : 압축 없음
  • Gzip : 압축률 보통
  • Brotli : 압축률 높음
  • 이때, 엡 서버도 압축된 파일을 인식할 수 있도록 설정이 필요할 수 있습니다.
  • 따라서 서버 압축 설정 없이도 게임이 돌아갈 수 있는 안전장치로 아래와 같이 설정해 주면 좋습니다.
  • Decommpression Fallback : 서버가 압축파일을 자동으로 풀어주지 못할 때, Unity WebGL 플레이어가 직접 압축을 해제하는 기능
  • 그러나 압축 해제용 JavaScript가 추가되고, 빌드 파일 크기가 증가하고 이에 따라 로딩속도가 살짝 느려질 수 있습니다.
  • 그럼에도 비상안전장치로서는 추천합니다.