2020 이전/이것저것

드로우 콜과 텍스처 아틀라스와 배치와 인스턴싱

이상해C++ 2018. 11. 8. 20:33


1. 드로우 콜

draw call:  CPU가 OpenGL이나 DirectX의 함수를 호출하여 GPU에게 그리기(draw call)을 요청하는 것. 그래픽 API의 모든 드로우콜은 CPU상의 상당한 퍼포먼스 오버헤드를 일으킨다. 


draw call을 줄이기 위해 게임 엔진은 batch기술을 제공한다. batch object를 만들고, 그 객체의 자식으로 이미지 스프라이트 컴포넌트를 가진 오브젝트를 생성하면 batch object를 생성하는것이기 때문에 드로우 콜은 1번만 호출된다. 


드로우콜 발생조건


위 그림 기준으로 

1. 메쉬가 여러개인 경우(3번)

2. 마테리얼이 여러개(마테리얼만 2번: 얼굴마테리얼, 눈 마테리얼)

3. Shader에 의한 경우(2-pass, 외곽선 그릴때 검은색 단색으로 한번 그리고, 나중에 본체 한번 그린다.)



2. 렌더스테이트

CPU가 렌더 스테이트를 변경하는 명령을 보내면 GPU는 렌더스테이트 테이블(VRAM에 미리 Set되어있는 Resources)에 그 정보를 저장한다. 그런 렌더스테이트는 셰이더, 메쉬, 알파블렌드여부, z-test, 텍스터레지스터, 샘플러 등등이 될 수 있다. 이런 명령들은 병렬작업을 수행하기 위해 Command Buffer를 거친다.


CPU는 GPU에 렌더State를 세팅한뒤 최종적으로 그리라는 명령을 보낸다. 이게 Draw Primitive Call이다.


즉, 드로우콜은 넓은 의미로는 RenderStateChange와 DrawPrimitiveCall을 포함한 것이된다.


3. 아틀라스

Textuer atlas: 텍스쳐 아틀라스는 스프라이트 시트, 이미지 스프라이트라고도 부른다. 텍스처 아틀라스는 아틀라스의 크기를 줄이기 위해 작은 이미지들을 같이 패킹해 놓은 이미지.



텍스쳐 아틀라스


batching에서 같은 아틀라스에 존재하는 이미지는 같은 이미지 파일로 취급되기 때문에 한 번의 드로우콜로 여러 오브젝트를 그릴 수 있다. 텍스처 레지스터에 한번만 세팅해주면 아틀라스 오프셋정보만 상수버퍼 또는 정점 버퍼로 넘기기만 한다던가 그런식으로 안바꿔도 되니까!


4. 배치(Batch)


배치는 넓은 의미의 드로우 콜이다. 실제적으로 하드웨어에게 draw명령을 내리는 것과 오브젝트를 렌더하기위한 RenderState를 변경하는 것까지 포함이다.


그 중에서 SetPass는 배치 중에서 렌더스테이트의 변경여부이다. 엄밀히 말하면 마테리얼/셰이더로 발생하는 렌더링 스테이터 변경 횟수. 서로 다른 메쉬라도 동일 마테리얼을 가지고있다면 SetPass가 늘어나지 않는다. 대신 배치가 발생하지... 



5. 배칭과 인스턴싱

배칭은 여러개의 배치를 하나의 배치로 만드는 과정이다. 


 

 배칭

인스턴싱 

 공통점

여러 개의 오브젝트를 그릴 때 한번의 드로우 콜로 처리가 된다.  

 여러 개의 오브젝트를 그릴 때 한번의 드로우 콜로 처리가 된다.  

 차이점

정점구조가 다른 메쉬들을 하나로 합치는 작업이 필요하다. 별도의 메쉬 집합을 생성한다(메모리 요구)


CPU에서 지오메트리 정보를 연산하여 별도의 메쉬를 합친다.

 정점구조가 완전히 같은 메쉬들이라는 제약이 있다. 이들을 한번의 드로우 콜 호출로 여러개 그려낼 수 있다. 


CPU에서 오브젝트의 단순 트랜스폼 정보를 버퍼에 담아서 GPU에 제공한다, 


정적배칭(static batching): 정적인 오브젝트들을 큰 메쉬로 합치고 그것을 렌더한다. 


동적배칭(dynamic batching): 동적인 오브젝트들은 매 프레임마다 CPU에서 메쉬들의 vertices를 변환하고(버텍스버퍼 인덱스 버퍼를 채우는 오버헤드 발생) 그룹으로 묶은 뒤, 한번에 렌더한다. 유니티에서 동적배칭은 동일 마테리얼, 스킨드 메쉬가 아니여야하고, 메쉬별 버텍스 한계가 있다. 


정적 배칭은 메모리와 저장 오버헤드를 야기할 수 있고, 동적배칭은 CPU 오버헤드를 발생시킬 수 있다.



참고: 

유니티 그래픽스 최적화 스타트업 : http://www.yes24.com/Product/Goods/67305196 


유니티 최적화 : http://mentum.tistory.com/53


cocos creator 는 연속된 요청에서 같은 이미지를 가진 오브젝트가 존재한다면 auto batching을 이용해 한번의 드로우콜로 여러오브젝틑를 한번에 그린다.

http://hyeooona825.tistory.com/32




'2020 이전 > 이것저것' 카테고리의 다른 글

vector index접근 iterator 접근  (0) 2019.01.15
한줄설명  (0) 2019.01.11
xml & json  (0) 2018.11.05
Singleton  (0) 2018.11.04
Coroutine  (0) 2018.11.03