C++ 和 DX11 中的动态常量缓冲区或动态顶点缓冲区

Dynamic Constantbuffer or Dynamic Vertex Buffer in c++ and DX11

我有一个关于内存使用的问题

动态常量缓冲区 vs 常量缓冲区更新频繁(使用默认使用类型) vs 动态顶点缓冲区

我总是将 Constnat 缓冲区使用定义为默认值,并像这样实时更新更改

例如 1

D3D11_BUFFER_DESC desc;
desc.Usage = D3D11_USAGE_DEFAULT;
// irrelevant code omitted

void Render()
{
WORLD = XMMatrixTranslation(x,y,z); // x,y,z are chaned dynamiclly
 ConstantBuffer cb;
 cb.world = WORLD;

devcon->UpdateSubResource(constantBuffer,0,0,&cb,0,0);

// Set the VSSetBuffer and PSSetBuffer
}

但是最近我看到了rastertek的一个教程,它使用 devcon->Map() 和 devcon->Unmap() 更新它们,他将用法定义为 Dynamic

如 2

void CreateBuffer(){
D3D11_BUFFER_DESC desc;
desc.Usage = D3D11_USAGE_DYNAMIC; // irrelkavant code ommited
}
void Render()
{
 WORLD = XMMatrixTranslation(x,y,z); // x,y,z are chaned dynamiclly
 D3D11_MAPPED_SUBRESOURCE mappedRes;
 ConstantBuffer *cbPtr;

devcon->Map(constantBuffer,0,D3D11_MAP_WRITE_DISCARD,0,&mappedRes);
 cbPtr = (ConstantBuffer*)mappedRes.pData;
 cbPtr->World = WORLD;
devcon->UnMap(constantBuffer,0);
}

所以问题是.

在运行时(eg1)使用动态常量缓冲区(eg2)而不是默认的 ConstatnBuffer 更新是否有任何性能提升或影响??

请帮我解开这个疑惑..

谢谢

与大多数性能建议一样,这里的答案是 "It depends"。两者都有效,这实际上取决于您的内容和渲染模式。

此处的经典性能参考是 Windows 现实:在您的游戏中充分利用 Direct3D 10 图形 来自 Gamefest 2007

如果您要处理大量常量,如果您的数据分散并作为更新周期的一部分收集,动态常量缓冲区的映射会更好。如果您所有的常量都已经在系统内存中正确布局,那么 UpdateSubResource 可能更好。如果您在一帧中多次重复使用相同的 CB 并且 Map/Locking 它,那么您可能 运行 进入 'rename' 限制 Map/Lock 而 UpdateSuResource 问题较少所以“这取决于”真的是这里的答案。

当然,所有这些都与 DirectX 12 一起出现 window,DirectX 12 具有完全不同的机制来处理等效的动态更新。