드로우 콜
1. 개요
1. 개요
드로우 콜은 컴퓨터 그래픽스에서 CPU가 GPU에게 특정 그래픽 객체를 렌더링하도록 지시하는 명령이다. 이는 실시간 렌더링이 필요한 게임이나 3D 애플리케이션에서 그래픽 장면을 구성하는 기본 단위로 작동한다.
드로우 콜의 수는 렌더링 성능의 핵심 지표이다. 각 드로우 콜은 CPU가 GPU에 전달하기 위해 자료 구조를 준비하고 상태 변경을 수행하는 오버헤드를 수반한다. 따라서 장면 내 드로우 콜 수가 많을수록 CPU 부하가 증가하며, 과도한 경우 병목 현상과 프레임 드랍의 주요 원인이 된다.
이러한 성능 문제를 해결하기 위해 다양한 드로우 콜 최적화 기법이 사용된다. 대표적인 방법으로는 여러 객체를 하나의 드로우 콜로 묶는 배칭, 동일한 메시를 반복적으로 그리는 인스턴싱, 그리고 여러 텍스처를 하나로 합쳐 사용하는 아틀라스 텍스처 사용 등이 있다. 이러한 기법들은 게임 엔진에서 성능 최적화의 기본이 된다.
2. 드로우 콜의 개념
2. 드로우 콜의 개념
드로우 콜은 컴퓨터 그래픽스에서 CPU가 GPU에게 특정 그래픽 객체를 그리도록 지시하는 명령이다. 이때 그래픽 객체는 폴리곤 메시나 스프라이트 등이 될 수 있다. 실시간 렌더링이 필요한 게임이나 3D 애플리케이션에서 화면에 보이는 모든 물체는 하나 이상의 드로우 콜을 통해 그려진다. 따라서 드로우 콜은 그래픽스 파이프라인에서 CPU와 GPU 간의 핵심적인 통신 수단 역할을 한다.
드로우 콜이 발생할 때마다 CPU는 GPU에게 렌더링할 버텍스 데이터, 사용할 셰이더, 적용할 텍스처 및 머티리얼 파라미터 등 필요한 모든 상태 정보를 설정하고 전달해야 한다. 이 과정에는 상당한 오버헤드가 수반된다. 결과적으로 한 프레임 내에서 발생하는 드로우 콜의 총 횟수는 렌더링 성능에 직접적인 영향을 미치는 핵심 지표가 된다.
드로우 콜의 수가 과도하게 많아지면, GPU가 실제 폴리곤을 처리하는 데는 여유가 있더라도 CPU가 이러한 상태 설정과 명령 전달 작업에 많은 시간을 소모하게 된다. 이는 CPU 병목 현상을 유발하여 전체 프레임 레이트를 저하시키고 프레임 드랍의 주요 원인이 된다. 따라서 고품질의 실시간 렌더링을 구현하기 위해서는 드로우 콜의 수를 효율적으로 관리하고 최소화하는 드로우 콜 최적화가 필수적이다.
3. 드로우 콜의 중요성
3. 드로우 콜의 중요성
드로우 콜의 중요성은 실시간 렌더링 성능의 핵심 지표로서, 특히 프레임 레이트와 직결된다. CPU가 GPU에 내리는 렌더링 명령의 횟수인 드로우 콜이 많아질수록 CPU는 각 객체의 상태(예: 변환 행렬, 재질, 텍스처)를 설정하고 명령을 전송하는 데 많은 시간을 소비하게 된다. 이는 CPU 바운드 상태를 초래하여, GPU가 아직 여유 성능이 남아 있음에도 불구하고 다음 프레임을 준비하지 못하게 만드는 병목 현상의 주요 원인이 된다. 결과적으로 프레임 드랍이 발생하여 게임이나 3D 애플리케이션의 사용자 경험을 크게 저해한다.
따라서 드로우 콜의 수를 관리하고 최적화하는 것은 모든 게임 개발 및 실시간 그래픽스 프로젝트에서 필수적인 과정이다. 현대의 복잡한 오픈 월드 게임이나 고품질 시각 효과를 요구하는 시뮬레이션에서는 수천에서 수만 개에 달하는 객체를 화면에 표시해야 하며, 이를 각각 개별적인 드로우 콜로 처리하는 것은 현실적으로 불가능하다. 개발자들은 드로우 콜 수를 줄이기 위해 배칭이나 인스턴싱 같은 기법을 적극적으로 활용하여, 가능한 한 많은 객체를 하나의 드로우 콜로 묶어서 처리함으로써 CPU의 부담을 줄이고 GPU의 처리 효율을 극대화한다.
성능 최적화 외에도 드로우 콜은 렌더링 파이프라인의 효율성을 이해하는 중요한 개념이다. 드로우 콜의 빈도와 비용을 분석함으로써 개발자는 어디에서 성능 저하가 발생하는지 정확히 진단할 수 있다. 이는 프로파일링 도구를 통해 드로우 콜 횟수를 모니터링하고, 특정 씬이나 카메라 시점에서의 부하를 평가하는 데 기초 자료가 된다. 결국, 드로우 콜을 효과적으로 관리하는 것은 안정적인 프레임 레이트를 유지하고, 더 복잡하고 아름다운 그래픽을 구현할 수 있는 토대를 마련한다는 점에서 현대 컴퓨터 그래픽스의 핵심 과제 중 하나이다.
4. 드로우 콜 최적화 기법
4. 드로우 콜 최적화 기법
4.1. 배칭
4.1. 배칭
배칭은 여러 개의 개별적인 드로우 콜을 하나의 큰 드로우 콜로 묶어 처리하는 최적화 기법이다. 이 기법은 CPU와 GPU 간의 통신 오버헤드를 줄이는 데 목적이 있다. CPU가 GPU에 렌더링 명령을 전달할 때마다 발생하는 준비 작업과 상태 설정 비용을, 유사한 특성을 가진 여러 객체를 한 번에 처리함으로써 크게 절감할 수 있다. 배칭은 특히 동일한 머티리얼과 텍스처를 공유하는 객체들에 효과적으로 적용된다.
배칭은 크게 정적 배칭과 동적 배칭으로 구분된다. 정적 배칭은 움직이지 않고 변화가 없는 정적 객체들을 미리 결합하여 런타임에 하나의 드로우 콜로 렌더링하는 방식이다. 이는 주로 배경이나 환경 오브젝트에 사용되며, 게임이나 애플리케이션 실행 전에 미리 처리된다. 반면, 동적 배칭은 매 프레임마다 위치나 형태가 변할 수 있는 동적 객체들을 런타임에 실시간으로 묶어 처리한다. 동적 배칭은 추가적인 연산 비용이 들지만, 여전히 개별적인 드로우 콜을 여러 번 호출하는 것보다 성능상 유리한 경우가 많다.
배칭의 효과는 렌더링 파이프라인에서 CPU가 담당하는 작업 부하를 경감시켜 전체적인 프레임 레이트를 안정화하는 데 있다. 수천 개에 이르는 드로우 콜을 수백 개 이하로 줄임으로써, CPU의 여유 자원을 물리 계산이나 인공지능 로직 등 다른 게임 시스템에 할당할 수 있게 된다. 따라서 배칭은 게임 엔진이나 3D 애플리케이션에서 필수적인 성능 최적화 수단으로 자리 잡았다.
4.2. 인스턴싱
4.2. 인스턴싱
인스턴싱은 동일한 메시를 여러 번 그려야 할 때 드로우 콜의 수를 획기적으로 줄이는 최적화 기법이다. 예를 들어, 숲을 구성하는 수많은 나무나 전투 장면의 군중과 같이 동일한 3D 모델이 반복적으로 등장하는 경우, 각 객체마다 개별적인 드로우 콜을 발생시키는 대신, 하나의 드로우 콜로 여러 개의 복사본을 한꺼번에 렌더링한다.
이 기법의 핵심은 GPU에게 하나의 기본 메시 데이터와 각 인스턴스별로 다른 변환 행렬(위치, 회전, 크기), 색상, 애니메이션 오프셋 등의 데이터를 별도로 제공하는 데 있다. CPU는 한 번의 호출로 모든 인스턴스를 그리도록 명령하며, GPU는 제공된 데이터를 바탕으로 각 인스턴스를 버텍스 셰이더 단계에서 변환하여 화면에 출력한다. 이는 정적 배칭이나 동적 배칭과 달리 객체가 완전히 정적이지 않아도 효과적으로 적용될 수 있다는 장점이 있다.
주요 게임 엔진인 유니티와 언리얼 엔진은 모두 인스턴싱을 지원하며, 특히 그래픽스 API인 DirectX와 OpenGL의 최신 버전에서는 하드웨어 인스턴싱 기능을 표준으로 제공한다. 인스턴싱을 적극적으로 활용하면 수천 개의 동일 객체를 렌더링하는 장면에서도 프레임률을 안정적으로 유지할 수 있어, 대규모 환경을 구현하는 실시간 렌더링 애플리케이션의 필수 최적화 수단으로 자리 잡았다.
4.3. 텍스처 아틀라스
4.3. 텍스처 아틀라스
텍스처 아틀라스는 여러 개의 작은 텍스처나 스프라이트를 하나의 큰 텍스처 이미지로 합쳐서 만드는 기법이다. 이렇게 통합된 텍스처 맵을 사용하면, 렌더링 과정에서 각각의 작은 텍스처를 개별적으로 바인딩하기 위해 발생하는 드로우 콜의 수를 크게 줄일 수 있다. 게임에서는 특히 UI 요소, 타일맵, 폰트 렌더링, 그리고 다양한 오브젝트의 재질을 처리할 때 이 기법이 효과적으로 적용된다.
텍스처 아틀라스를 생성할 때는 각 서브 텍스처의 UV 좌표를 새로 계산하여, 통합된 큰 텍스처 내에서 해당 부분을 정확하게 샘플링할 수 있도록 해야 한다. 이 과정은 주로 개발 도구나 에셋 파이프라인에서 오프라인으로 처리된다. 아틀라스 사용의 가장 큰 장점은 GPU가 텍스처를 교체하는 데 소요되는 시간과 리소스를 절약할 수 있다는 점이다. 텍스처 스위칭은 비용이 큰 작업이므로, 이를 최소화하는 것은 성능 향상에 직접적으로 기여한다.
그러나 텍스처 아틀라스 기법에도 단점은 존재한다. 모든 서브 텍스처를 하나의 큰 이미지에 담아야 하므로, 메모리 사용 측면에서 비효율이 발생할 수 있다. 예를 들어, 아틀라스 내부의 빈 공간이 많거나, 특정 서브 텍스처만 자주 업데이트되어야 하는 경우에는 오히려 성능이 저하될 수 있다. 또한, 밉맵 생성이나 텍스처 필터링 시 아틀라스 경계에서 아티팩트가 발생하지 않도록 주의 깊게 설계해야 한다.
이 기법은 유니티나 언리얼 엔진과 같은 주요 게임 엔진에서 널리 지원되며, 2D 게임 개발에서 특히 필수적인 최적화 수단으로 자리 잡았다. 엔진의 스프라이트 패커 같은 내장 도구를 사용하면 개발자가 비교적 쉽게 텍스처 아틀라스를 생성하고 관리할 수 있다.
4.4. 레벨 오브 디테일
4.4. 레벨 오브 디테일
레벨 오브 디테일은 렌더링할 객체의 시각적 복잡도를 카메라와의 거리에 따라 동적으로 조절하는 최적화 기법이다. 이 기법의 핵심은 관찰자가 멀리 있는 객체는 낮은 폴리곤 수의 단순한 모델로, 가까이 있는 객체는 높은 폴리곤 수의 상세한 모델로 렌더링하는 것이다. 이를 통해 장면 전체의 폴리곤 수를 크게 줄여 GPU의 처리 부하를 감소시키고, 동시에 불필요하게 상세한 객체를 처리하기 위한 드로우 콜의 발생 빈도도 낮출 수 있다.
구현 방식은 일반적으로 하나의 객체에 대해 여러 단계의 메시 데이터를 미리 준비하는 것이다. 예를 들어, 한 나무 모델에 대해 10,000개의 폴리곤으로 구성된 고해상도 모델, 1,000개의 폴리곤으로 구성된 중간 모델, 100개의 폴리곤으로 구성된 저해상도 모델을 제작한다. 게임 엔진은 매 프레임마다 각 객체와 카메라 사이의 거리를 계산하여 미리 설정된 임계값에 따라 적절한 레벨 오브 디테일 단계를 선택하여 렌더링 명령을 전송한다. 이 과정은 주로 CPU에서 수행되며, 효율적인 관리를 통해 성능 향상을 가져온다.
이 기법은 특히 대규모의 오픈 월드 게임이나 복잡한 장면을 다루는 3D 컴퓨터 그래픽스 애플리케이션에서 필수적이다. 시각적 품질의 저하를 최소화하면서도 렌더링 성능을 극대화할 수 있어, 프레임 레이트를 안정적으로 유지하는 데 기여한다. 레벨 오브 디테일은 텍스처 압축이나 메시 압축과 같은 다른 자원 최적화 기법과 함께 종합적으로 적용되는 경우가 많다.
4.5. 오클루전 컬링
4.5. 오클루전 컬링
오클루전 컬링은 카메라 시야 내에 있더라도 다른 오브젝트에 가려져 보이지 않는 객체들을 렌더링 대상에서 사전에 제거하는 최적화 기법이다. 이 기법은 렌더링 파이프라인의 초기 단계에서 적용되어, 시야 절두체 컬링을 통과한 객체들 중에서도 실제로 화면에 보이지 않을 객체들을 걸러내 추가적인 드로우 콜과 GPU 연산을 방지한다. 주로 복잡한 실내 공간이나 빽빽한 오브젝트가 많은 게임 씬에서 성능 향상에 크게 기여한다.
구현 방식은 다양하며, 정적 레벨 디자인에 미리 계산된 데이터를 사용하는 방식과 실시간으로 가려짐을 판단하는 방식으로 나뉜다. 전자의 대표적인 예로 BSP 트리나 PVS 기법이 있으며, 후자에는 하드웨어의 깊이 버퍼를 활용하는 하이재로키컬 Z-버퍼 컬링이나 소프트웨어 오클루전 컬링이 있다. 최신 게임 엔진들은 대부분 복합적인 방식을 채택하여 효율성을 극대화한다.
이 기법의 효과는 장면의 구성에 크게 의존한다. 넓은 개활지처럼 오클루전이 적은 오픈 월드 환경보다는, 복도와 방이 많은 실내 FPS 게임이나 빌딩 숲과 같은 도시 환경에서 더욱 두드러진 성능 개선을 보인다. 적절히 구현된 오클루전 컬링은 불필요한 폴리곤 처리와 텍스처 필터링 작업을 줄여 GPU 부하를 경감시키는 동시에, 렌더링할 객체 리스트를 최소화함으로써 CPU의 드로우 콜 준비 부담도 함께 줄여준다.
5. 드로우 콜과 렌더링 파이프라인
5. 드로우 콜과 렌더링 파이프라인
드로우 콜은 렌더링 파이프라인의 핵심적인 단계 중 하나로, CPU가 GPU에게 특정 그래픽 객체를 그리도록 지시하는 명령이다. 이 과정은 API를 통해 이루어지며, 그래픽스 파이프라인의 초기 단계에서 시작된다. CPU는 렌더링할 메시의 정점 데이터, 사용할 셰이더, 텍스처, 변환 행렬 등의 상태 정보를 설정한 후, 드로우 콜을 발행하여 GPU의 작업을 개시한다.
렌더링 파이프라인 내에서 드로우 콜 이후의 작업은 주로 GPU가 담당한다. GPU는 CPU로부터 받은 명령과 데이터를 바탕으로 정점 셰이더, 픽셀 셰이더 등의 단계를 거쳐 최종 프레임 버퍼에 이미지를 완성한다. 따라서 드로우 콜은 CPU와 GPU 간의 작업 분기점이자 협업의 시작점 역할을 한다. 드로우 콜의 빈도와 복잡성은 CPU의 작업량을 직접적으로 결정하며, 이는 전체 렌더링 성능에 지대한 영향을 미친다.
파이프라인 최적화 관점에서, 드로우 콜의 수를 줄이는 것은 CPU 부하를 경감시키는 가장 효과적인 방법 중 하나이다. 배칭이나 인스턴싱과 같은 기법은 여러 개의 별도 드로우 콜을 하나 또는 소수로 통합하여 CPU의 명령 준비 및 전송 오버헤드를 대폭 줄인다. 또한, 오클루전 컬링은 시야에서 보이지 않는 객체에 대한 불필요한 드로우 콜 자체를 발행하지 않음으로써 파이프라인의 효율성을 높인다.
결국, 효율적인 실시간 렌더링을 위해서는 드로우 콜이 렌더링 파이프라인의 다른 단계들과 조화를 이루도록 관리해야 한다. 게임 엔진이나 그래픽스 엔진은 개발자가 이러한 복잡성을 직접 관리하지 않도록 다양한 자동화된 최적화 기능을 제공하며, 드로우 콜의 생명주기를 파이프라인 전체의 흐름 속에서 최적의 상태로 유지하도록 설계된다.
6. 주요 게임 엔진에서의 드로우 콜
6. 주요 게임 엔진에서의 드로우 콜
각 게임 엔진은 자체적인 렌더링 아키텍처를 바탕으로 드로우 콜을 관리하고 최적화하는 방식을 제공한다. 유니티는 정적 배칭과 동적 배칭을 지원하며, 스태틱 배처가 자동으로 움직이지 않는 오브젝트들을 하나의 큰 배치로 합쳐 드로우 콜을 줄인다. 언리얼 엔진은 자체적인 렌더링 스레드와 명령 리스트를 활용하여 효율적으로 드로우 콜을 처리하며, 특히 인스턴싱과 히에라키컬 인스턴싱을 강력하게 지원한다.
크라이엔진은 그래픽스 파이프라인 전반에 걸쳐 높은 수준의 최적화를 지향하며, 엔진 차원에서 오클루전 컬링과 레벨 오브 디테일 시스템을 통합하여 불필요한 드로우 콜을 사전에 제거하는 데 중점을 둔다. 고드오브 엔진은 모바일 플랫폼에 특화되어 있어, 텍스처 아틀라스 사용을 권장하고 드로우 콜 수를 최소화하는 데 초점을 맞춘 렌더링 설정을 제공한다.
개발자는 프로젝트의 요구사항과 타겟 플랫폼에 따라 적절한 게임 엔진을 선택하고, 해당 엔진이 제공하는 드로우 콜 최적화 도구와 기능을 숙지하여 렌더링 성능을 극대화해야 한다.
