D3D12 – PipelineState폭발

D3D 12에선 ID3DPipelineState란 놈이 있다.
그러니까 과거에 DepthStencilState과 RasterState와 BlendState를 합치고 거기에 VertexShader와 PixelShader까지 합쳐서 한 세트로 만든 객체다.

이걸 미리 만들어두고 렌더링할때 한번만 set하면 물론 빠르겠지.
기존처럼 각 스테이트를 따로 설정하는거보다 당연히 빠르겠지.

문제는 쉐이더 폭발에다 각종 스테이트의 조합 상태까지 곱해져서 엄청나게 많은 PipelineState가 미리 생성되어야 한다는 점이다.

성능을 올리기 위해서 정말 눈에 뵈는거 없이 노력했단건 알겠는데.
이걸 가지고 프로그램 짤 수 있겠어? 미친거 아냐?
아 물론 짤 수 있지. 저 구조에 맞추려면 오지게 복잡해지니까 짜증나는거지.

DepthStencilState와 BlendState와 RasterState와 VertexBuffer타입과 PixelShader타입으로 고유키를 만들어서 고유키에 해당하는 PipelineState를 찾아보고 없으면 PipelineState를 만들어서 키에 맵핑하는 식으로 코드를 짜면 된다.

그런데 이렇게까지 해서 얻을 수 있는 성능 향상이란게 그렇게 큰가?
어차피 게임성능에서 GPU병목이 가장 큰 문제이고 그래픽카드를 바꾸면 게임은 두배씩 빨라진다. CPU에서 약간의 병목을 줄이겠다고 이 짓거리를 해야하느냔 말이다.

칼을 뽑았으니 무를 베긴 하겠지만 계속 회의가 드는건 어쩔 수 없음.


D3D12 – PipelineState폭발”에 대한 답글 2개

  1. DirectX12의 성능 최적화 골자는 GPU가 많이 사용되면 CPU에 분산하고 CPU가 많이 사용되면 GPU로 분산하는 이기종 공유 메모리였던 것 같습니다.

    좋아요

    1. DX12 성능의 골자는
      1. CPU측 레이어를 얇게 만들어서 API호출에 걸리는 지연시간을 줄인다.
      2. GPU HW큐에 최대한 많이(병렬적으로, 비동기적으로) 커맨드를 쑤셔넣을 수 있도록 한다.
      입니다.

      CPU가 많이 사용되는 상황에서 GPU로 CPU의 부하를 부산할 방법은 없어요. GPU의 부하를 CPU로 분산시킬 방법도 없고요. 할 수 있는 일도, 일을 시키는 방법도 완전히 다릅니다.

      좋아요

답글 남기기

댓글을 게시하려면 다음의 방법 중 하나를 사용하여 로그인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중