CPU (Central Processing Unit, 중앙 처리 장치)
: 화면에 그려야할 대상과 대상을 그릴 방법 결정
GPU (Graphics Processing Unit, 그래픽 처리 장치)
: CPU의 지시를 받아 화면을 그림
[렌더링 파이프라인]
. 씬 안의 모든 오브젝트를 검사한다.
. 카메라의 뷰 프러스텀에 위치해야 렌더링되며, 렌더링 되지 않는 오브젝트는 컬(Cull) 처리 된다고 한다.
. CPU가 렌더링 되는 모든 오브젝트에 대한 정보를 수집하면 드로우 콜(Draw Call)로 정렬한다.
. 드로우콜에는 단일 메쉬와 이 메쉬의 렌더링 방법에 대한 정보가 담겨있다.
ex) 어떤 텍스쳐를 사용하는 지에 대한 정보도 담겨 있다.
. 서로 다른 오브젝트를 동일한 드로우 콜로 결합하는 것을 배칭(Baching)이라고 한다.
[드로우 콜을 포함하는 모든 배치마다, CPU 처리 과정]
. CPU는 렌더 상태라고 알려진 여러 변수값을 변경하기 위해 GPU에 명령 전달, 이 명령을 SetPass Call이라고 한다.
. SetPass Call은 다음 메쉬를 렌더링하는데 사용할 설정을 GPU에 알려주는 역할을 한다.
. CPU는 GPU에 드로우 콜을 전달, 드로우 콜은 가장 최근에 전달된 SetPass Call에 정의된 설정들을 사용해 지정된 메쉬를 렌더링하도록 GPU에 지시한다.
[GPU 처리과정]
. GPU는 CPU에서 전달받은 순서대로 작업 처리한다.
. 현재 처리 작업이 SetPass Call인 경우, GPU는 렌더 상태를 업데이트한다.
. 현재 처리 작업이 드로우 콜인 경우, GPU는 메쉬를 렌더링한다.
이 과정은 쉐이더 코드의 개별 섹션에 정의된 단계에서 발생하며, 매우 복잡하다.
간단히 버텍스 쉐이더 코드 섹션은 GPU에 메쉬의 정점을 처리하는 방법을 전달하고,
프래그먼트 쉐이더 코드 섹션은 GPU에 개별 픽셀을 그리는 방법을 전달한다는 점을 이해하도록 한다.
. 이 프로세스는 CPU로부터 전달된 작업이 GPU에 모두 처리될때까지 반복한다.
[렌더링 문제 유형]
CPU와 GPU 모두 프레임을 렌더링하기 위해 각자 맡은 작업을 완료해야 한다.
이러한 작업 중 하나라도 완료되는데 오래 걸리면, 프레임 렌더링 지연이 발생할 수 있다.
첫번째로, 비효율적인 파이프라인에 의해 발생한다.
렌더링 파이프라인 중 하나 이상의 단계가 완료되는데 오랜 시간이 걸리면서 원활한 데이터 흐름을 방해하는데 이 것을 병목 현상(Bottleneck)이라 한다.
두번째로, 너무 많은 데이터를 넣으려고 할 때 발생한다.
CPU가 렌더링하는데 오래 걸리는 문제가 발생하면 CPU바운드(CPU Bound, CPU에 묶여 있는 상태)
GPU가 렌더링하는데 오래 걸리는 문제가 발생하면 GPU바운드(GPU Bound, GPU에 묶여 있는 상태)
[문제 찾아내기]
GPU에 명령을 보낼 때, 가장 시간이 오래 걸리는 작업이 SetPass Call이다.
GPU에 명령을 보내는 과정때문에 게임이 CPU바운드인 경우, SetPass Call의 수를 줄이는 것이 성능 향상에 가장 좋은 방법이다.
- 렌더링할 오브젝트 수를 줄이면 Batch 및 SetPass Call 모두 감소
- 오브젝트를 렌더링하는 횟수를 줄이면 일반적으로 SetPass Call 감소
- 렌더링할 오브젝트 데이터를 더 적은 수의 Batch로 합치면 Batch 감소
[문제 해결하기 - CPU바운드인 경우]
1. 렌더링되는 오브젝트 줄이기
- 단순히 씬에 보이는 오브젝트 수를 줄인다.
- 카메라의 Far Flip Plane을 이용해 카메라가 화면을 그리는 거리 줄인다.
- 먼 곳에 위치한 오브젝트가 화면에 안보이도록 위장하려면 Fog를 적용한다.
- 거리 기반으로 오브젝트를 숨기는 것을 좀 더 세분화하려면 카메라의 Layer Cull Distances를 이용한다.
레이어별로 커스텀 컬링 거리를 설정할 수 있다.
- Occlusion Culling을 사용하면 다른 오브젝트에 의해 가려지는 오브젝트 렌더링을 생략할 수 있다.
2. 오브젝트 렌더링 횟수 줄이기
- 동적 라이팅말고 Baked라이팅을 사용한다.
- 실시간 그림자를 사용하는 경우, Quality Settings에서 그림자를 세팅한다.
- Refelction Probes는 사실적인 반사효과를 주지만, 배치 측면에서 매우 비싼 기능이므로 사용을 최소화한다.
3. 더 적은 배치로 오브젝트 합치기
- 정적 배칭을 사용하되, 메모리 사용량이 증가할 수 있어 이 비용을 염두한다.
- 동적 배치는 CPU 사용량에 영향을 줄 수 있어 신중히 적용한다.
- 동일한 재질과 텍스쳐를 사용하는 메쉬는 CombineMesh를 고려한다.
* Batch처리된 오브젝트 재질에 접근할 때는 Renderer.sharedMaterial을 사용한다.
Renderer.material을 사용하는 경우 배칭이 깨진다.
4. 컬링, 정렬 그리고 배칭
- 배칭은 GPU에 명령 전달 속도를 크게 향상시키지만, 때론 오버헤드를 발생시키기도 한다.
5. Skinned Meshes
- 본 애니메이션 기술을 이용해 메쉬를 애니메이션시킬 때 SkinnedMeshRenderer를 사용한다.
- 일반적으로 애니메이션이 적용된 캐릭터에 사용되며, 비싼 처리 작업이 될 수 있다.
- 만약 게임이 CPU바운드가 되는 원인이 SKinned Mesh때문이라면
애니메이션이 필요없는 모델인 경우 MeshRenderer로 교체한다.
모델을 임포트하고 설정에서 애니메이션 임포트를 해제하면 SkinnedMeshRenderer대신 MeshRenderer를 사용하게 된다.
[문제 해결하기 - GPU바운드인 경우]
1. Fill Rate
- GPU가 매 초마다 화면에 렌더링할 수 있는 픽셀 수를 나타낸다.
FIll Rate에 의해 게임이 GPU바운드인지 확인하는 법
1 게임을 프로파일링해 GPU시간 확인
2 Player Settings에서 화면 해상도 Display Resolution을 낮춘다.
3 게임을 다시 프로파일링
4 성능 향상했다면 Fill Rate가 문제일 가능성 높다.
복잡한 프래그먼트 쉐이더는 가장 일반적인 필레이트 문제의 원인
즉, 게임에서 유니티 내장 쉐이더를 사용하는 경우, 최대한 단순하고 최적화된 쉐이더를 사용하는 것이 좋다.
유니티에서 제공되는 모바일 쉐이더는 고도의 최적화 과정을 거쳤으므로 논-모바일 프로젝트에서 모바일 쉐이더를 사용해도 무방
2. Overdraw
- 동일한 픽셀이 여러번 그려지는 경우
- Geometry 큐는 오버드로우를 최소화하기 위해 앞에서 뒤로 정렬
- Transparent 큐는 오버드로우를 최소화하기 위해 뒤에서 앞으로 정렬
사실 뒤에서 앞으로 정렬하는 방식은 Transparent 큐에 있는 오브젝트의 오버드로우를 최대화하는 효과가 있다.
3. 메모리 대역폭
- GPU에서 메모리에 읽고 쓰는 속도를 나타낸다.
메모리 대역폭이 문제인지 확인하는 법
1 게임 프로파일링 GPU시간 체크
2 Quality Settings에서 현재 플랫폼의 Texture Quality와 Quality Target을 낮춘다.
3 다시 프로파일링후 GPU시간 체크
4 성능 향상했다면 메모리 대역폭이 문제일 가능성 높다.
4. 정점 프로세싱
- GPU에서 메쉬의 각 정점을 렌더링하기 위해 처리해야하는 작업을 나타낸다.
게임이 GPU바운드인데 필레이트와 메모리 대역폭 문제가 아닌경우 정점 프로세싱 문제일 가능성 높다
1 불필요한 메쉬를 줄인다.
2 노멀 매핑을 사용한다. (GPU 오버헤드가 다소 발생하나 대부분 성능 이득)
3 메쉬가 노멀 매핑을 사용안하는 경우, 메쉬 임포트 설정에서 정점 탄젠트 사용 비활성해준다. GPU에 전달되는 각 정점 데이터양 줄어든다.
4 LOD로 알려진 Level Of Detail은 카메라에서 멀리 떨어진 메쉬 복잡도를 낮춰 최적화하는 기술
LOD는 비주얼 퀄리티에 영향을 주지 않고, GPU에서 렌더링하는 정점 수 낮춘다.
정점 쉐이더의 복잡도를 낮추는 것이 정점 프로세싱 문제에 도움이 될 수 있다.
출처 : http://ronniej.sfuh.tk/optimizing-graphics-rendering-in-unity-games1/
'유니티 > 꿀팁ㅇㅇㅇ' 카테고리의 다른 글
모바일 렌더링 세팅 (0) | 2018.07.12 |
---|---|
뷰포리아 (0) | 2018.06.29 |
해결해야할 과제 (0) | 2018.05.18 |
가비지 컬렉션이란? (0) | 2018.04.26 |
프레임 (0) | 2018.04.26 |