D3D 12에선 ID3DPipelineState란 놈이 있다.
그러니까 과거에 DepthStencilState과 RasterState와 BlendState를 합치고 거기에 VertexShader와 PixelShader까지 합쳐서 한 세트로 만든 객체다.
이걸 미리 만들어두고 렌더링할때 한번만 set하면 물론 빠르겠지.
기존처럼 각 스테이트를 따로 설정하는거보다 당연히 빠르겠지.
…
문제는 쉐이더 폭발에다 각종 스테이트의 조합 상태까지 곱해져서 엄청나게 많은 PipelineState가 미리 생성되어야 한다는 점이다.
성능을 올리기 위해서 정말 눈에 뵈는거 없이 노력했단건 알겠는데.
이걸 가지고 프로그램 짤 수 있겠어? 미친거 아냐?
아 물론 짤 수 있지. 저 구조에 맞추려면 오지게 복잡해지니까 짜증나는거지.
DepthStencilState와 BlendState와 RasterState와 VertexBuffer타입과 PixelShader타입으로 고유키를 만들어서 고유키에 해당하는 PipelineState를 찾아보고 없으면 PipelineState를 만들어서 키에 맵핑하는 식으로 코드를 짜면 된다.
그런데 이렇게까지 해서 얻을 수 있는 성능 향상이란게 그렇게 큰가?
어차피 게임성능에서 GPU병목이 가장 큰 문제이고 그래픽카드를 바꾸면 게임은 두배씩 빨라진다. CPU에서 약간의 병목을 줄이겠다고 이 짓거리를 해야하느냔 말이다.
칼을 뽑았으니 무를 베긴 하겠지만 계속 회의가 드는건 어쩔 수 없음.
DirectX12의 성능 최적화 골자는 GPU가 많이 사용되면 CPU에 분산하고 CPU가 많이 사용되면 GPU로 분산하는 이기종 공유 메모리였던 것 같습니다.
좋아요좋아요
DX12 성능의 골자는
1. CPU측 레이어를 얇게 만들어서 API호출에 걸리는 지연시간을 줄인다.
2. GPU HW큐에 최대한 많이(병렬적으로, 비동기적으로) 커맨드를 쑤셔넣을 수 있도록 한다.
입니다.
CPU가 많이 사용되는 상황에서 GPU로 CPU의 부하를 부산할 방법은 없어요. GPU의 부하를 CPU로 분산시킬 방법도 없고요. 할 수 있는 일도, 일을 시키는 방법도 완전히 다릅니다.
좋아요좋아요