UpdataSubresource
- 매 프레임 1번 미만으로 일어나는 Resource Update에 적절하다.
- 해당 Buffer의 크기와 같은 Data를 받아 내부적으로 Resource Data를 Map / UnMap 하여 Resource Copy 한다.
- 하나의 Resource에 Thread를 이용하여 동시에 복사는 불가능. (내부에서 Lock / Unlock 하기 때문)
- CPU에서 GPU로 데이터를 복사하는 방식.
Map / UnMap
- 매 프레임 1번 이상으로 일어나는 Resource Update에 적절하다.
- 해당 Buffer를 Map을 통해 Unlock 하여 변경하고 싶은 Resource Data를 memcpy 하고, UnMap하여 Buffer를 Lock
해주어야 한다.
- GPU에서 GPU로 데이터를 복사하는 방식.
위 그래프를 보면 Full Image 같은 경우 매 프레임 변경이 있을 경우, UpdateSubresource는 피하는게 좋을것 같다는
생각이 든다.
Constant Buffer는 생각이 좀 많아지는데, 일단 현재로썬 DrawCall 사이에 해당 Constant Buffer를 Map/UnMap을 통해 Copy하는 부분이 많은데 NVidia에선 하나의 상수 버퍼만 업데이트 하도록 권장하고 있다.
또한 상수 버퍼에 메모리를 빠르게 복사하려면 16byte 정렬이 된 Struct를 Copy하는것이 빠르다고 한다.
template<typename T>
inline void ShaderBase::ConstantBufferUpdate(T* cBuffer)
{
// 해당 Value 찾기..
std::unordered_map<Hash_Code, ConstantBuffer*>::iterator it = m_ConstantBufferList.find(T::GetHashCode());
// 해당 Key에 대한 Value가 없다면..
if (it == m_ConstantBufferList.end()) return;
// 해당 Constant Buffer Register Bind Index의 Resource 검색..
ConstantBuffer* cBuf = it->second;
ID3D11Buffer* buffer = m_ConstantBuffers[cBuf->register_number].Get();
// Constant Buffer Usage에 따른 Resource Update..
switch (cBuf->cUsage)
{
case CBUFFER_USAGE::DEFAULT:
case CBUFFER_USAGE::IMMUTABLE:
{
g_DeviceContext->UpdateSubresource(buffer, 0, nullptr, cBuffer, 0, 0);
}
break;
case CBUFFER_USAGE::DYNAMIC:
{
// Mapping SubResource Data..
D3D11_MAPPED_SUBRESOURCE mappedResource;
ZeroMemory(&mappedResource, sizeof(D3D11_MAPPED_SUBRESOURCE));
// GPU Access Lock Buffer Data..
g_DeviceContext->Map(buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
// Copy Resource Data..
memcpy(mappedResource.pData, cBuffer, cBuf->cSize);
// GPU Access UnLock Buffer Data..
g_DeviceContext->Unmap(buffer, 0);
}
break;
case CBUFFER_USAGE::STAGING:
break;
default:
break;
}
}
- 현재 작업중인 엔진에서 Constant Buffer 용도 별로 네이밍을 두어 나눌까 생각하였는데 보기에도 불편하고 설정해 주는것이 추후에 찾기도 편할것 같아서 해당 Resource Usage 설정은 수동으로 하는 방식으로 진행하기로 하였다. 이전에 설정된 Shader Constant Buffer 용도에 따라 해당 Usage를 설정하여 Usage에 따른 Resource Update를 하고 있다.
'DirectX 11' 카테고리의 다른 글
[DirectX 11] Particle System (0) | 2021.12.26 |
---|---|
[DirectX 11] Terrain Mesh Blending (0) | 2021.12.20 |
[DirectX 11] Animation (0) | 2021.12.18 |
[DirectX 11] Skinning Mesh (0) | 2021.12.18 |
[DirectX 11] Normal Mapping (0) | 2021.12.18 |