728x90

DirectX 11에서는 Resource에 데이터를 넣는 함수는 4개가 존재한다.


UpdateSubresource(), Map() ~ Unmap(), CopyResource(), CopySubresourceRegion()


이 함수들은 자주 사용되는 만큼 어느 정도는 알고 사용해야 할 것 같아서 정리한다.




우선 함수의 속도를 보면 UpdateSubresource()는 웬만하면 매 프레임마다 사용하지 않는 것이 좋다는 생각이 들 것이다.



CPU -> GPU로 데이터를 복사할 때 사용하는 함수는 UpdateSubresource()와 Map() ~ Unmap()을 사용하게 된다. 


Map() ~ Unmap()의 경우 개발자가 직접 Lock() ~ Unlock()을 하며 memcpy()를 이용해서 Resource에 데이터를 직접 넣는 방법이고, UpdateSubresource()는 함수 호출만으로 내부에서 Lock() ~ Unlock()을 해주기 때문에 나의 경우 UpdateSubresource()를 더 즐겨 사용하는 편이다.


그리고 기본적으로 Lock() ~ Unlock()이 걸리게 되므로, 하나의 Resource에 Thread를 이용하여 동시에 CPU -> GPU로 복사는 불가능하다.



GPU -> GPU로 데이터를 복사할 때 사용하는 함수는 CopyResource()와 CopySubresourceRegion()가 있다. 


이 함수의 차이는 CopyResource()는 Full Image를 그대로 복사하고, CopySubresourceRegion()는 영역을 지정하여 복사가 가능한 것이다.


이 두개의 함수는 기본적으로 비동기 함수이다. 그렇기 때문에 하나의 Resource에 Thread를 이용하여 GPU -> GPU 복사는 얼마든지 가능하다.


테스트를 해보았을 때에는 Frame Rate는 거의 차이가 없었다.



국내 사이트에서는 자료가 없기에 해외 사이트를 검색하여 얻은 자료를 토대로 테스트 결과를 정리해보았다.


참조 사이트 : https://eatplayhate.me/2013/09/29/d3d11-texture-update-costs/

728x90

+ Recent posts