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/
'Visualization Programming > DirectX11' 카테고리의 다른 글
DirectX11 - OMSetRenderTargets() 사용시 주의사항 (0) | 2016.10.06 |
---|---|
DirectX11 - Deferred Context Memory Leak (0) | 2016.06.30 |
DirectX11 - Dispatch()와 [numthreads] (0) | 2016.03.28 |
DirectX11 - DirectCompute 메모리 모형 (0) | 2016.03.16 |
DirectX11 - DirectCompute의 스레드 (0) | 2016.03.09 |