유니티 최적화 기법
유니티 최적화 기법에는 오브젝트 풀링, 비용이 큰 수학 연산 줄이기,
Class와 Struct를 적절하게 사용하는 방법 등 많은 최적화 기법이 있다.
최적화를 할 때 가장 중요한 부분은 병목을 줄이는 것이다.
즉 전체 시스템이 하나의 요소로 인해 성능 저하되는 것을 막는 것이 가장 중요하다.
이러한 요소들을 찾아 최적화를 진행해야 한다.
드로우콜
CPU가 GPU에게 렌더링(화면에 출력)할 정보를 전송하는 것이다
드로우콜은 CPU 성능 저하를 일으키므로 최적화를 통해 줄여야 한다.
Unity 내에서 Stats 버튼을 눌러 Batches 의 개수를 통해 드로우콜의 개수를 확인할 수 있다.
이 Batches의 개수는 드로우콜 + Set Pass Call 이다.
만약 같은 메테리얼을 가진 오브젝트를 10개 그린다고 가정해보자.
첫번째 그리는 오브젝트에서 DrawCall + Set Pass Call 이 호출되고나면
두번째 오브젝트부터는 DrawCall 만 GPU에 전달하면 된다.
즉 Batches에 비해 Set Pass Call을 최대한 줄여야 최적화가 잘 되는 것이다.
Set Pass Call을 최대한 줄이는 방법
1. Material 을 적게 쓴다 (Material Varient 수를 적게 유지)
2. Material 교체 비용이 많이 발생하지 않도록 Renderer 옵션의 Sorting Layer 를 통해
동일한 Material 들을 하나로 묶어서 그리게 한다
3. Dynamic 배칭과 Static 배칭을 적극 활용한다 => 더 공부해보자
여담으로 셰이더 멀티패스의 경우 단일 메쉬에서도 여러번의 드로우콜이 발생한다고..
ex) 외곽선 등 여러번 그려지는 툰쉐이더.. 어쩐지 어제 배치 700 찍더라..
Find 함수 사용을 자제해야 하는 이유
- 유니티 엔진 내부에서 모든 객체들 중 원하는 객체를 string 기반으로 검색하여 반환하는 함수.
- 성능 저하, 이름 변경에 따른 오류, 이름 중복 등의 문제를 일으킬 수 있어 사용을 자제하는 것이 좋다
Update에서 GetComponent와 그 계열의 캐싱을 지양해야하는 이유
- GetComponent 메서드는 할당에 성공하거나 실패해도 언제나 GC가 발생한다.
- 비싼 연산이라 Update에서 매 프레임 실행되면 성능 저하가 심하다.
- Awake, Start 메서드에서 필드에 캐싱하여 사용하는 것이 좋다.
- TryGetComponent를 이용하면 GC 걱정없이 사용할 수 있다.
POT(Power of Two) 텍스쳐란?
가로 세로의 크기가 2의 제곱식으로 설정되는 것을 의미한다.
컴퓨터에서 이미지를 로드할 때 POT texture가 아닐 경우 POT 크기로 변형해 사용하므로 메모리 낭비가 발생한다.
NPOT 텍스처를 사용할 경우 기존 로드된 텍스처와 가장 가까운 사이즈의 2의 승수를 찾아 해당 승수를 그대로 복사해 사용한다.
→ 메모리에 두개의 텍스쳐가 올라가게 된다.
아틀라스란?
아틀라스는 여러 이미지들을 한 묶음으로 만든다
앞에서 동일 메터리얼을 공유하면 드로우 콜을 줄일 수 있다고 했다.
아틀라스로 텍스쳐들을 하나로 묶어주면 매터리얼들을 일괄적으로 처리 가능하며 드로우 콜을 줄일 수 있다.
오브젝트 풀
자주 사용하는 오브젝트들을 미리 생성해두고, 필요할 때마다 Pool에서 꺼내와 오브젝트를 사용,
사용이 끝난 후에는 오브젝트를 Pool에 반납하는 기법
Unity 프로파일러란?
프로파일러는 성능 분석을 위한 도구이다. 프로파일러를 사용하여 어떤 문제로 인해 프로그램의 성능 저하가
일어났는지 확인할 수 있다.
'Study > 개념 정리' 카테고리의 다른 글
[Study] Graph와 길찾기 (0) | 2024.07.19 |
---|---|
[Study] Tree (0) | 2024.07.18 |
[Study] 코루틴 (0) | 2024.07.16 |
[Study] MonoBehaviour와 Unity 생명주기 (0) | 2024.07.15 |
[Study] Queue (0) | 2024.07.12 |