개발 노트 vulkan 병렬 렌더링 고민 2019/04/09 02:35 by cagetu

Vulkan 작업해보면서, CommandPool > CommandBuffer, Queue를 어떻게 구분해서 병렬 렌더링 쓰레드를 구성해야 하나? 라는 주제에 관심도 많이 가고, 고민도 많이 된다.

일단 찾아본 내용으로 정리하면, 대략 아래와 같다.
  • CommandPool은 쓰레드 당 하나씩 생성하도록 한다. 그리고, CommandPool에서 생성된 CommandBuffer도 동일한 쓰레드에서 사용한다. (동기화 비용을 최대한 줄이기 위해)
  • CommandBuffer에 레코딩 하는 쓰레드와 Queue에 서밋하는 쓰레드는 다를 수 있다.
  • 단일 쓰레드라고 하더라도, CommandBuffer를 Frame 단위로 레코딩해서 처리한다.
  • Frame 단위로 나누는 것도 방법이다. 
위의 내용을 기반으로 대충 아래와 같은 그림으로 설계를 해보았다.
  • RenderAgent(Thread) 마다 CommandPool or Queue를 가질 수 있다.
  • RenderAgent 내부에서는 다수의 CommandBuffer를 생성해서 사용할 수 있다.
  • Queue에 서밋하는 것은 다른 Thread에서 진행될 수 있다. (이러면 동기화 필요)
  • 각 Thread 사이에는 메시지(RenderCommand)를 통해서 통신한다. 

멀티 쓰레드 렌더링을 해본 경험이 적어서 부족하지만 일단 이 방향으로 진행해보자!!!

p.s) 여러 의견을 들어보니 단일 쓰레드로 하는 것이 더 나은 성능을 발휘한다고 한다. 즉, 단일 쓰레드에 프레임 단위로 레코딩해서 기다리는 시간 없도록 운영한다면 충푼히 성능 상의 이득을 얻을 수 있다는 것이다. (이건 한번 해봐야 할 듯 하다. 결국 테스트를 위해서 스케일 아웃 될 수 있도록 구현되어야 한다!)


덧글

댓글 입력 영역



메모장

내가 먼 훗날에 이 글들을 보았을 때, 좋은 추억이 될 수 있기를...

나를 위해... 나에게 쓰는...

msn: cagetu@hotmail.com
mail: cagetu79@gmail.com
twitter: twitter.com/cagetu
facebook: facebook.com/cagetu