티스토리 뷰

IT지식

유니티 최적화 하기 - CPU

민자르 2018. 7. 22. 13:04
반응형

[CPU 처리 과정 이해]


- CPU는 중앙처리 장치로서 대상을 화면에 그려야 할 방법을 결정합니다.

- GPU는 그래픽 처리 장치로서 CPU 지시에 따라서 화면을 그립니다.

- 그래서 렌더링 과정에서 어떤 작업 흐름에 따라서 처리되는지 살펴봅니다.


# 매 프레임 렌더링 될때마다 CPU의 할 일


- CPU는 오브젝트의 렌더링 여부를 결정하기 위해, Scene안의 모든 오브젝트를 검사합니다. 검사 과정에서 특정 기준에 해당 하는 오브젝트만 렌더링됩니다. 

예를 들어, 카메라 뷰 프러스텀(Frustum)내에 위치되면 렌더링하고 그 외 오브젝트는 cull 처리 됩니다. 

- CPU는 렌더링 되는 모든 오브젝트에 정보를 수집하여, 드로우 콜(Draw Call)이라는 명령 단위로 정렬합니다. 드로우 콜에는 단일 메쉬가 렌더링 되는 방법에 대한 정보가 담겨있습니다.

예를 들어, 어떤 텍스쳐를 사용하는지 특정 상황에서 설정을 공유하는 오브젝트들은 동일한 드로우 콜로 결합될 수 있습니다. 서로 다른 오브젝트를 동일한 드로우 콜로 결합하는 것을 배칭(Baching)이라고 합니다.

- CPU는 매 드로우 콜마다 배치(Batch)라고 불리는 데이터 패킷을 생성되는데 일반적으로는 드로우 콜에 대한 정보가 있습니다. 물론 다른 데이터가 포함될 수도 있습니다.


# 드로우 콜을 포함하는 모든 배치 처리 과정


- CPU는 렌더 상태에서 여러 변수를 GPU에 명령으로 전달 합니다. 이 명령을 SetPass Call 이라고 합니다. SetPass Call 은 다음번 메쉬를 렌더링 하는데 사용할 설정을 GPU에 알려주는 역활을 합니다. 메쉬의 상태를 변경해야 할때만 전달됩니다.

- CPU는 GPU에 드로우 콜을 전달합니다. 드로우 콜은 가장 최근에 전달된 SetPass Call에 정의된 설정을 사용하여 지정된 메쉬를 렌더링하도록 GPU에게 명령합니다.

- 배치에 두개 이상의 페스가 필요한 경우도 있습니다. 패스는 쉐이터 코드의 섹션이며, 패스가 추가될 때마다 렌더 상태의 변경이 발생합니다. 배치의 각 패스마다 CPU는 새로운 SetPass Call을 전달한 다음 드루우 콜을 다시 전달해야 합니다.


# GPU 작업 처리


- GPU는 CPU에서 전달 받은 순서대로 처리합니다.

- 현재 처리하는 작업이 SetPass call인 경우 GPU는 렌더 상태를 업데이트 합니다.

- 현재 처리하는 작업이 드로우콜인 경우 GPU는 메쉬를 렌더링합니다. 이때 쉐이터 코드의 개발 섹션에 정의된 단계에서 발생합니다. 버텍스 쉐이터 섹션은 GPU에 메쉬의 정점을 처리하는 방법으로 전달하고, 프래그먼트 쉐이터(fragment shader) 섹션은 GPU에게 픽셀을 그리는 방법을 전달합니다.

- CPU로부터 전달된 작업이 GPU에서 모두 처리될때까지 반복됩니다.


[최적화 고려 사항]


# CPU

 - 너무 많은 DRAW CALL

 - 복잡한 스크립트나 물리 연산


# Vertex Processing

 - 너무 많은 버텍스들

 - 버텍스당 너무 많은 연산 (Vertex Shader)


# Fragment Processing

 - 너무 많은 픽셀, 오버 드로우 (Over Draw)

 - 프래그먼트당 너무 많은 연산 (Fragment Shader / Pixel Shader)


# Band Width

 - 크고, 압축되지 않은 텍스쳐

 - 고해상도 프레임 버퍼



728x90
반응형
댓글