참고 영상


CPU에서는 현재 프레임에서 무엇을 어떻게 그려야하는가를 결정하게 된다.

CPU가 결정한 내용을 GPU에 오브젝트를 그리라고 명령을 내리는데 이것이 드로우콜(Draw Calls)이다.

따라서 드로우콜은 CPU에서 GPU로 정보가 넘어가는 시점에 발생한다.

 

드로우 콜

1. System Memory에서 GPU Memory로 Data( Vertex/Index Buffers, Textures )를 전달

GPU가 Data를 그리기위하여 정보를 미리 Memory에 저장시킨다.

 

2. 드로우 콜!!

GPU Memory에 저장된 Data 가운데 무엇을 어떻게 그리는지 Render State(GPU State)를 변경시킨다.

 

드로우 콜 병목 현상

드로우 콜은 보여지는 장면이 얼마나 복잡한가(장면 복잡도)에 따라 드로우콜이 발생한다.

 

CPU Bound

CPU의 명령어를 GPU가 이해하기 위한 low-level hardware 명령어로 번역작업하는 작업이 필요하다. (Graphic Driver가 해줌)

CPU의 드로우콜이 많이 발생하여 명령이 오래걸린다면 한 프레임에 GPU가 그려야하는 작업에 문제가 발생할 수 있다.

 

GPU Bound

 

 

드로우 콜의 발생

Mesh #1 + Material #1 = Draw call #1

Mesh #N = Draw call #N

Mesh #N + Material #1 = Draw call #N

 

Mesh #1 + Material #N = Draw call #N

Material #N = Draw call #N

 

By Shader

쉐이더(Pixel Shader, Vertex Shader)에 의해서 드로우 콜이 달라질 수 있다

Multi Pass : 동일한 씬을 여러번 Pass가 발생하는 경우

(toon shader에서 음영을 그리고 이후에 실루엣을 그리는 등 여러번 그려 드로우 콜이 여러번 발생하는 경우)

 

 

드로우 콜 줄이기 (최적화)

렌더되는 오브젝트 줄이기

1. 씬에 보이는 오브젝트 수 줄이기

단순히 씬에 보이는 오브젝트의 수를 줄여 드로우 콜을 줄이는 방법

 

2. 카메라의 Near, Far Clipping Plane의 거리 줄이기

너무 가깝거나 너무 먼 오브젝트는 보여질 필요가 없기 때문에 그리지 않는다.

(Frustum Culling : 유니티가 기본적으로 제공하고 있는 컬링 기법)

 

3. 오클루전 컬링

실제로 보이는 영역만 필요하기 때문에 가려지거나 물체의 뒷부분은 그리지 않는다.

 

4. LOD (Level of Detail)

멀리 있는 오브젝트는 정교하게 표현될 필요성이 없기 때문에 거리에 따라 오브젝트의 디테일을 구분하여 그린다.

오브젝트의 Mesh 수가 줄어들어 드로우 콜이 줄어든다.

 

 

오브젝트 렌더링 횟수 줄이기

대부분 라이트 이슈로 볼 수 있음

 

1. 리얼타임 라이트 대신 Baked 라이트 사용

(포워드 랜더링 기준) 라이트 개수 만큼 Draw call이 발생하고 결과를 합치게 된다.

미리 계산된 라이트 (Baked 라이트)를 사용하여 드로우 콜을 줄일 수 있다.

 

2. 실시간 그림자를 사용하는 경우 Quality Setting 조정

그림자의 Quality를 낮춰서 최적화를 진행한다.

 

3. Reflection Probes의 사용 최소화

반사되는 재질은 꼭 필요한 경우에만 사용한다.

 

아틀라스(altlas) 사용

Material을 줄여 드로우 콜을 줄이기 위한 방법

Mesh #1 + Material #N = Draw call #N -> Mesh #1 + Material #1 = Draw call #1

- 하나의 메시에 사용되는 여러개의 텍스쳐 맵을 하나로 합치기

 

배치 렌더링 (Batch Rendering : Batching) 사용

Mesh #N + Material #1 = Draw call #N -> Mesh #1 + Material #1 = Draw call #1

여러 드로우 콜이 필요한 상황을 하나의 드로우 콜로 묶는 과정

Material 기준 : 다른 오브젝트, 다른 Mesh를 사용하더라도 같은 Material을 사용하면 하나의 Batch 구성이 가능

텍스처만 다른 동일한 Material 2개가 있는 경우 : Atlas를 통해 하나의 Material로 통합 -> Batching 사용

 

배칭의 종류

정적 배칭 (Static Batching)

배경이나 건물같이 움직이지 않는 정적인 오브젝트를 큰 Mesh로 합치고 더 빠른 방법으로 렌더링

 

장점 : 동적 배칭보다 Vertex 연산이 필요하지 않아 효율적이다.

단점 : 오브젝트를 내부적으로 하나의 메시로 만들어 통합된 메시를 저장할 메모리가 추가로 필요하다.

 

정적 배칭은 씬을 모듈화하여 제작하는 방식이 가능하다.

* Merging -> visibility culling problem

만일 하나의 커다란 Mesh로 만들어지면 화면에 일부만 보이더라도 Mesh 전체의 폴리곤들을 처리해야함 (GPU부담)

 

동적 배칭 (Dynamic Batching)

Mesh가 충분히 작은 경우 Mesh의 정접이 CPU에서 트렌스폼되고, 여러 유사한 Mesh가 그룹화되어 모든 것이 한번에 드로우됨.

 

동적으로 움직이는 오브젝트들끼리 배칭처리

동일한 Material을 사용하고 특정 조건들을 만족하는 다이나믹 오브젝트들에 대한 자동 배칭

다이나믹 배칭에 사용되는 정보를 모아 정점 버퍼와 인덱스 버퍼에 담음

매 프레임마다 오버헤드 발생

매번 데이터 구축과 갱신 발생.

오버헤드에도 불구하고 드로우 콜을 줄임으로 전체적인 성능 향상

 

한계

Unity3D경우 Skinned Mesh 적용 불가 : GPU 고속 연산 수행

정점이 너무 많은 메시는 대상에서 제외 : 오버헤드 > 드로우콜 (정점이 작은 Mesh만 사용)

 

GPU Instancing

Instancing와 Batching, Clustering 유사점

한번의 드로우 콜로 여러 오브젝트들을 한번에 처리

 

Instancing와 Batching, Clustering 차이점

배칭과는 달리 동일한 메시의 복사본들을 만듦

런타임 오버헤드가 적음

Batching : 지오메트리 정보들을 하나의 메시로 합치는 과정

Instancing : 별도의 메시를 생성하지 않음

 

처리 방법

Instancing되는 오브젝트들의 트랜스폼 정보를 별도의 버퍼에 저장

GPU는 트랜스폼 정보들이 담긴 버퍼와 원본 메시를 가져다가 여러 오브젝트들을 한번에 처리

 

728x90

'Program > Program' 카테고리의 다른 글

Rendering Pipeline  (0) 2022.09.08
컴퓨터 동작 원리  (0) 2022.04.21
컴퓨터 언어 체계  (0) 2022.04.19
프로그래밍 개념  (0) 2022.04.06

+ Recent posts