Deff_Dev

[Unity] 최적화 본문

면접 질문 정리/Unity

[Unity] 최적화

Deff_a 2024. 7. 17. 14:21

1. 유니티 최적화 기법은 어떤 것들이 있나요?

  • 최적화를 해본 적이 있나요? 없다면 어떤 최적화가 있는지 설명해주세요.
    • GetComponent 및 객체 생성 최적화
      • 문제: GetComponent는 비용이 높은 연산이며, new로 객체를 생성하면 힙 메모리에 계속 할당된다.
      • 해결: 자주 사용되는 컴포넌트는 캐싱하고, 객체 풀링(Object Pooling)을 사용해 객체 재사용한다.
    • Coroutine 최적화
      • 문제: StartCoroutine은 메모리 할당을 동반하므로 자주 시작/중단하는 것은 비효율적이다.
      • 해결: 시작/중단을 자주하는 기능은 코루틴이 아닌 다른 방법을 사용한다.
        • ex) UniTask
    • 문자열 최적화
      • 문제: 문자열 비교와 연결은 새로운 문자열을 생성하며, 이는 메모리 상으로 비효율적이다.
      • 해결: 문자열 비교는 변수를 사용하고, 문자열 연결은 StringBuilder를 사용해 효율적으로 처리한다.
    • 어드레서블(Addressable)
      • 문제: 리소스를 게임에 모두 포함하면 빌드 용량커지고 메모리를 많이 사용한다.
      • 해결: Addressable을 사용해 리소스를 동적으로 로드하여 빌드 용량을 줄이고 메모리를 효율적으로 사용한다.
    • TextMeshPro Material
      • 문제: SDF 폰트의 Material을 수정할 때, SDF 폰트를 복사하여 사용한다면 비효율적이다.
      • 해결: SDF 폰트의 Material을 복사해 사용하면 효율적으로 사용할 수 있다.
    • 오브젝트 Static
      • 문제: 움직이지 않는 오브젝트도 매 프레임마다 렌더링되면 비효율적이다.
      • 해결: 고정형 오브젝트는 Static으로 설정해 배치를 줄인다.
    • LOD (Level of Detail)
      • 문제: 멀리 있는 객체도 높은 해상도로 렌더링하면 성능이 저하된다.
      • 해결: 객체의 거리나 중요도에 따라 다양한 해상도의 모델이나 텍스쳐를 사용다.
  • 최적화에서 가장 중요한 부분은 무엇인가요?
    • 최적화의 핵심은 성능을 저하시키지 않는 선에서 메모리를 효율적으로 관리하는 것이 중요하다.
    • 어떤 부분에서 병목인지를 정확하게 찾는 과정인 프로파일링을 한 뒤에 최적화 작업을 진행하는 것이 중요하다.
  • 최적화를 위한 텍스쳐 포맷에 대해 설명해주세요.
    • TC1/ETC2 (Ericsson Texture Compression)
      • 사용처: 주로 안드로이드 플랫폼.
      • 장점: ETC1은 투명도를 지원하지 않지만, ETC2는 투명도를 지원하며, 높은 압축률을 제공해 메모리 사용량을 줄인다.
      • 예시: 게임 내 배경 텍스처나 고정된 오브젝트에 사용해 메모리 절약.
    • PVRTC (PowerVR Texture Compression)
      • 사용처: 주로 iOS 플랫폼.
      • 장점: 매우 높은 압축률을 제공하며, 모바일 장치에서 효율적으로 사용된다.
      • 예시: 아이폰과 아이패드용 게임에서 다양한 텍스처에 사용.
    • DXT (S3 Texture Compression)
      • 사용처: 주로 PC 및 콘솔 플랫폼.
      • 장점: 높은 압축률과 품질을 제공하며, 다양한 해상도의 텍스처에 적합하다.
      • 예시: PC 게임에서 환경 텍스처나 캐릭터 모델에 사용.
    • ASTC (Adaptive Scalable Texture Compression)
      • 사용처: 안드로이드 및 iOS 플랫폼.
      • 장점: 매우 유연한 압축 옵션을 제공하며, 다양한 비트레이트와 품질 수준을 설정할 수 있다.
      • 예시: 고품질이 요구되는 텍스처에서 메모리 사용을 최적화하기 위해 사용.

2. Find 함수 사용을 자제해야 하는 이유에 대해 설명해주세요.

  • Find 함수는 해당 씬 Hierarchy 창에 있는 모든 오브젝트를 탐색하면서 찾는 것이기 때문에 매우 비용이 높은 함수이다.
  • 사용을 한다고 해도 초기화 시 한 번만 호출하는 것이 좋다.

3. Update에서 GetComponent와 그 계열의 캐싱을 지양해야하는 이유를 설명하세요.

  • GetComponent는 해당 오브젝트에 존재하는 모든 컴포넌트를 찾기 때문에 비용이 높다.
  • 그렇기 때문에 초기화 단계에서 사용한 뒤, 해당 정보를 캐싱하여 사용한다.

4. 메모리 최적화 방법에 대해 알고 있는 것이 있나요?

 

POT(Power of Two) 텍스쳐에 대해 설명해주세요.

 

POT

  • 텍스쳐 가로/세로 크기가 2의 제곱수인 텍스쳐
  • 컴퓨터는 바이너리 데이터를 효율적으로 처리할 수 있기 때문에 POT 텍스쳐는 성능 최적화에 도움을 준다.

NPOT

  • 텍스쳐 가로/세로 둘중 크기가 하나라도 2의 제곱수가 아닌 텍스쳐
  • NPOT 텍스쳐를 사용할 때는 GPU가 텍스쳐와 가장 가까운 사이즈의 2의 승수를 찾아서 해당 텍스쳐를 그대로 복사하는데, 이때, 메모리에 2개의 텍스쳐가 올라가기 때문에 효율이 좋지 않다.
  • 그렇기 때문에 처음 부터 POT 텍스쳐를 쓰는것이 좋다.

아틀라스에 대해 설명해주세요.

  • 여러 개의 텍스쳐를 단일 텍스쳐로 결합하는 에셋으로, 텍스쳐를 불러올 때, 발생하는 드로우콜을 줄일 수 있다.
  • 단일 텍스쳐를 사용한다면 다른 텍스쳐 불러올 때마다 여러 개의 드로우 콜이 발생하지만 아틀라스를 사용하면 하나의 텍스쳐를 불러오면 하나의 드로우 콜만 발생시킨다.
  • 아틀라스를 통해 렌더링 효율성을 높이고, 메모리 사용을 최적화할 수 있다.

오브젝트 풀에 대해 설명해주세요.

  • 객체를 미리 생성해두고 필요할 때 재사용하며, 사용이 끝난 객체는 파괴하지 않고 풀에 반환하여 다시 사용할 수 있게 하는 디자인 패턴이다.
  • 사용 이유
    • 오브젝트를 Destroy할 때, 오브젝트는 게임에서 삭제되지만, 메모리 상으로 미세한 쓰레기 메모리들이 쌓이기 때문에 생성/ 삭제를 자주할 때, 쓰레기 메모리가 쌓여 GC 호출이 자주 일어날 수 있다.
    • 오브젝트 풀을 이용하면 오브젝트를 사용하고 삭제할 때, 삭제가 아닌 비활성화 함으로써 해당 오브젝트를 계속 재사용하고, 삭제로 발생하는 쓰레기 메모리를 최소화하여 가비지 컬렉터 호출을 줄인다.
    • 그렇다고 해서 무조건 오브젝트 풀이 좋은 것은 아니니 생성/ 삭제가 자주 일어나는 오브젝트에 한해서 사용하는 것이 좋다.

5. 드로우콜에 대해서 설명하고, 최적화하는 방식에 대해 알고 있는 것이 있으면 설명하세요.

  • 드로우 콜은 CPU가 GPU에게 렌더링 명령을 호출하는 것 이다.
  • 최적화 방식
    • 배치(Batching):
      • 여러 객체를 그룹화하여 한 번에 렌더링하는 기법, 배칭을 통해 드로우 콜의 횟수를 줄일 수 있다.
      • Unity에서는 정적 배칭(Static Batching)과 동적 배칭(Dynamic Batching)을 지원
        • 정적 배칭: 움직이지 않는 오브젝트들을 미리 계산하여 한 번에 그리는 방법
        • 동적 배칭: 프레임마다 변화하는 오브젝트들을 효율적으로 그리는 방
    • 오클루전 컬링(Occlusion Culling):
      • 카메라에 보이지 않는 오브젝트는 렌더링하지 않도록 하여 드로우 콜을 줄인다.
    • LOD(Level of Detail):
      • 객체의 거리나 중요도에 따라 다양한 해상도의 모델이나 텍스처를 사용하는 기법
      • 멀리 있는 객체는 낮은 해상도로 렌더링하여 드로우 콜을 최적화한다.
    • 텍스처 아틀라스(Texture Atlas):
      • 여러 텍스처를 하나의 큰 텍스처로 결합하여 드로우 콜을 줄입니다. 여러 개의 작은 텍스처를 사용하는 대신 하나의 큰 텍스처를 사용하여 렌더링다.

6. Unity 내에서 드로우콜을 확인할 수 있나요? 어떤 방법을 통해 확인할 수 있을까요?

  • 기본적으로 Stat 창에서 Batches로 알려준다.
  • 유니티에서 제공하는 ProfilerRecorder를 이용하여 확인할 수 있다.
 

유니티 - OnGUI, ProfilerRecorder로 런타임 드로우 콜 확인하기 (How to Get Draw Call Count at Runtime)

Unity 전체 링크 참고 - OnGUI로 실시간 초당 프레임 수 확인하기 - 드로우 콜 횟수 최적화하기 - ProfilerRecorder 메뉴얼 - Rendering Profiler module 메뉴얼 유니티 게임 씬에서 Stats에서는 성능과 관련된 정보

bloodstrawberry.tistory.com

 

  • 배치 : 드로우 콜을 줄이기 위해 여러 객체를 그룹화하여 한 번에 렌더링하는 기법
  • 배칭 : 여러 객체를 하나의 드로우 콜로 묶는 과정, 즉, 배치를 하는 과정
  • Set Pass Call :렌더링 과정에서 셰이더와 머티리얼의 상태를 GPU에 설정하는 명령배치는 무엇이고 Set Pass Call은 무엇인가요?
  1.  
 

Batch 및 SetPass Calls

GameView의 Statistics 창을 보면 DrawCall 을 나타내는 지표로 Batches 와 SetPass Calls 가 있다. 아니, DrawCall 횟수가 없네? 사실 몇달전 면접질문 중 하나가 유니티의 DrawCall 을 Batch와 SetPass Call 개념을 통해

shkim0811.tistory.com


7. Unity 프로파일러란 무엇이며 어떻게 사용하나요?

  • 유니티에서 제공하는 성능 분석 도구이다.
 

유니티 프로파일러(Profiler)를 이용해 성능 개선하기

게임을 만들 때 제일 골치 아픈 것은 최적화이다. 최적화가 정말 잘 된 게임, 이른바 갓적화인 게임은 낮은 성능의 컴퓨터로도 아주 섬세한 3D 그래픽을 60 프레임으로 표현할 수 있다. 반대로 최

dev-nicitis.tistory.com

 

'면접 질문 정리 > Unity' 카테고리의 다른 글

[Unity] 게임 수학  (0) 2024.07.27
[Unity] JSON과 직렬화  (0) 2024.07.22
[Unity] 코루틴  (1) 2024.07.16
[Unity] MonoBehavior와 Unity 생명주기  (0) 2024.07.15