본문 바로가기
DirectX/[Inflearn_삼각형] Vulkan

7. Vulkan Command Pool/Command Buffer

by 헛둘이 2025. 10. 18.

이 게시물은 Inflearn의 "삼각형" 님의 "삼각형의 실전! Vulkan 중급" 강의를 학습 목적으로 정리한 게시물입니다.

정리하는 과정에서 살을 붙이거나 강의의 핵심 내용이 누락되었을 수 있습니다.

좀 더 심도있고 깊은 내용을 듣고 싶으시다면 아래 링크를 참고해주세요.

https://www.inflearn.com/course/%EC%8B%A4%EC%A0%84-vulkan/dashboard

 

삼각형의 실전! Vulkan 중급| 삼각형 - 인프런 강의

현재 평점 3.3점인 강의를 만나보세요. 이 강의를 통해 수강생은 Vulkan의 핵심 개념을 이해할 수 있습니다. 이를 바탕으로 GPU를 효과적으로 사용하는 코드를 작성할 수 있습니다. Vulkan, Graphics

www.inflearn.com

 

Vulkan Command Buffer와 Command Pool


Command Buffer란?

Vulkan에서 Command Buffer는 GPU가 실행할 명령들을 미리 기록해 두는 객체로,
OpenGL의 SetVertexBuffer, DrawPrimitive 같은 명령 호출과 유사한 역할을 수행함.

Vulkan은 OpenGL과 달리

어떤 Command Buffer에 어떤 명령을 기록할지를 명시적으로 지정할 수 있음.

이 구조 덕분에 여러 스레드가 동시에 각자의 Command Buffer를 생성하고 기록할 수 있으며,
멀티스레드 렌더링 효율이 매우 높음.

Command Buffer는 CPU가 GPU로 전달할 명령 리스트(Command List) 역할을 하며,
기록이 완료된 후에는 Queue에 제출되어 실제 GPU에서 실행됨.

  • 명령의 실행 순서(order) 는 보장되지만
  • 종료 시점(completion) 은 보장되지 않음 → 먼저 제출된 Command Buffer가 늦게 끝날 수도 있음.

렌더링 병목의 대부분은 CPU가 GPU에 충분한 명령을 공급하지 못할 때 발생함.
따라서 Command Buffer의 효율적인 생성·기록·제출 구조를 설계하는 것이
Vulkan 렌더링 엔진의 성능을 좌우하는 핵심 포인트.


Command Buffer의 생명주기 (State Machine)

Command Buffer는 내부적으로 명확한 상태 전이 과정을 가짐.
각 상태는 vkBeginCommandBuffer, vkEndCommandBuffer, vkQueueSubmit, vkResetCommandBuffer 등의 호출에 따라 변경됨.

상태설명
Initial Command Buffer가 생성된 직후, 아직 아무 명령도 기록되지 않은 상태
Recording vkBeginCommandBuffer() 호출 후, 명령을 기록할 수 있는 상태
Executable vkEndCommandBuffer() 호출 후, Queue에 제출할 수 있는 상태
Pending Queue에 제출되어 GPU에서 실행 대기 또는 실행 중인 상태
Executable (again) GPU가 Command Buffer 처리를 완료하면 다시 실행 가능한 상태로 복귀
Invalid 명령 기록 중 오류 발생, 또는 One-Time Submit Command Buffer가 실행 완료된 상태

Invalid 상태의 Command Buffer는 더 이상 재사용할 수 없음.
vkResetCommandBuffer() 또는 vkResetCommandPool()을 호출하여 Initial 상태로 되돌릴 수 있음.

VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT 플래그로 생성된 Command Pool만
개별 Command Buffer의 리셋(vkResetCommandBuffer)이 가능함.
그렇지 않다면 Pool 전체 리셋(vkResetCommandPool)만 가능함.


Command Buffer의 종류

Primary Command Buffer 직접 Queue에 제출(submit)할 수 있는 명령 버퍼.
예: vkCmdBeginRenderPass ~ vkCmdEndRenderPass 같은 상위 렌더링 명령에 사용됨.
Secondary Command Buffer 다른 Command Buffer(보통 Primary) 안에서 호출되는 하위 명령 버퍼.
여러 스레드가 병렬로 명령을 기록하고, Primary Buffer가 이를 실행할 수 있음.

Secondary Buffer는 멀티스레드 병렬 렌더링에서 매우 유용함.
스레드별로 Command를 병렬 기록한 뒤, Primary Buffer가 통합 실행 가능.

 


Command Pool이란?

Command Pool은 Command Buffer를 할당하고 관리하는 객체.
모든 Command Buffer는 반드시 하나의 Command Pool로부터 생성됨.

  • Command Pool은 특정 Queue Family에 바인딩됨.
    → 같은 Queue Family에서 사용할 Command Buffer만 할당 가능.
  • 예를 들어, 그래픽용 Queue와 전송(Transfer)용 Queue는
    서로 별도의 Command Pool을 사용해야 함.

Command Pool은 스레드 안전(thread-safe) 하지 않음.
따라서 스레드마다 별도의 Command Pool을 생성하는 것이 권장됨.
스레드 안전성을 내부적으로 보장하면 동기화 비용이 증가해 오히려 성능이 저하될 수 있음.


Command Pool 생성 플래그

VK_COMMAND_POOL_CREATE_TRANSIENT_BIT Command Buffer가 자주 생성/해제될 것임을 드라이버에 알림.
드라이버가 메모리 재사용 전략을 최적화하여 할당/해제 비용을 줄임.
VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT 개별 Command Buffer를 vkResetCommandBuffer()로 직접 재설정할 수 있도록 허용.
이 옵션이 없으면 Pool 전체를 리셋(vkResetCommandPool())해야 함.

Command Buffer 재사용 전략

Command Buffer의 생성 비용은 상대적으로 크기 때문에
매 프레임마다 새로 생성하는 것은 비효율적.

효율적인 방법은 다음과 같음 👇

  • GPU 실행 완료 후 vkResetCommandBuffer()로 재사용
  • 프레임 인덱스 기반 다중 버퍼링(Double / Triple Buffering)
    → 여러 Command Buffer를 라운드 로빈 방식으로 순환 사용

이 방식은 CPU 부하를 줄이고 GPU에 끊김 없이 명령을 공급할 수 있게 함.


 

정리

Vulkan은 CPU가 GPU에 명령을 공급하는 방식 전체를 개발자가 제어할 수 있는 구조를 제공함.
Command Buffer와 Command Pool을 이해하고 효율적으로 관리하면,
멀티스레드 환경에서도 안정적이고 고성능의 렌더링 파이프라인을 구축할 수 있음.

'DirectX > [Inflearn_삼각형] Vulkan' 카테고리의 다른 글

8. Vulkan Swapchain Clear  (0) 2025.10.19
6. Vulkan Swapchain  (0) 2025.10.16
5. Vulkan Surface  (0) 2025.10.15
4. Vulkan Extension  (0) 2025.10.13
3. Vulkan Device (+Vulkan Queue)  (0) 2025.10.09

댓글