Deff_Dev
[Unity] 최적화 본문
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)
- 문제: 멀리 있는 객체도 높은 해상도로 렌더링하면 성능이 저하된다.
- 해결: 객체의 거리나 중요도에 따라 다양한 해상도의 모델이나 텍스쳐를 사용다.
- GetComponent 및 객체 생성 최적화
- 최적화에서 가장 중요한 부분은 무엇인가요?
- 최적화의 핵심은 성능을 저하시키지 않는 선에서 메모리를 효율적으로 관리하는 것이 중요하다.
- 어떤 부분에서 병목인지를 정확하게 찾는 과정인 프로파일링을 한 뒤에 최적화 작업을 진행하는 것이 중요하다.
- 최적화를 위한 텍스쳐 포맷에 대해 설명해주세요.
- TC1/ETC2 (Ericsson Texture Compression)
- 사용처: 주로 안드로이드 플랫폼.
- 장점: ETC1은 투명도를 지원하지 않지만, ETC2는 투명도를 지원하며, 높은 압축률을 제공해 메모리 사용량을 줄인다.
- 예시: 게임 내 배경 텍스처나 고정된 오브젝트에 사용해 메모리 절약.
- PVRTC (PowerVR Texture Compression)
- 사용처: 주로 iOS 플랫폼.
- 장점: 매우 높은 압축률을 제공하며, 모바일 장치에서 효율적으로 사용된다.
- 예시: 아이폰과 아이패드용 게임에서 다양한 텍스처에 사용.
- DXT (S3 Texture Compression)
- 사용처: 주로 PC 및 콘솔 플랫폼.
- 장점: 높은 압축률과 품질을 제공하며, 다양한 해상도의 텍스처에 적합하다.
- 예시: PC 게임에서 환경 텍스처나 캐릭터 모델에 사용.
- ASTC (Adaptive Scalable Texture Compression)
- 사용처: 안드로이드 및 iOS 플랫폼.
- 장점: 매우 유연한 압축 옵션을 제공하며, 다양한 비트레이트와 품질 수준을 설정할 수 있다.
- 예시: 고품질이 요구되는 텍스처에서 메모리 사용을 최적화하기 위해 사용.
- TC1/ETC2 (Ericsson Texture Compression)
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):
- 여러 텍스처를 하나의 큰 텍스처로 결합하여 드로우 콜을 줄입니다. 여러 개의 작은 텍스처를 사용하는 대신 하나의 큰 텍스처를 사용하여 렌더링다.
- 배치(Batching):
6. Unity 내에서 드로우콜을 확인할 수 있나요? 어떤 방법을 통해 확인할 수 있을까요?
- 기본적으로 Stat 창에서 Batches로 알려준다.
- 유니티에서 제공하는 ProfilerRecorder를 이용하여 확인할 수 있다.
- 배치 : 드로우 콜을 줄이기 위해 여러 객체를 그룹화하여 한 번에 렌더링하는 기법
- 배칭 : 여러 객체를 하나의 드로우 콜로 묶는 과정, 즉, 배치를 하는 과정
- Set Pass Call :렌더링 과정에서 셰이더와 머티리얼의 상태를 GPU에 설정하는 명령배치는 무엇이고 Set Pass Call은 무엇인가요?
7. Unity 프로파일러란 무엇이며 어떻게 사용하나요?
- 유니티에서 제공하는 성능 분석 도구이다.
'면접 질문 정리 > Unity' 카테고리의 다른 글
[Unity] 게임 수학 (0) | 2024.07.27 |
---|---|
[Unity] JSON과 직렬화 (0) | 2024.07.22 |
[Unity] 코루틴 (1) | 2024.07.16 |
[Unity] MonoBehavior와 Unity 생명주기 (0) | 2024.07.15 |