c ++和DX11中的动态Constantbuffer或动态顶点缓冲区

时间:2015-01-31 06:28:09

标签: c++ dynamic buffer directx-11 vertex-buffer

我有一个问题,通过使用

来记录使用情况

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

我总是定义Constnat缓冲区使用为defualt并实时更新实时更改

例如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()更新它们,他已将用法定义为动态

例如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);
}

所以问题是。

使用动态常量缓冲区(eg2)比runtim上的默认ConstatnBuffer更新(eg1)

有任何性能提升或命中

请帮我澄清这个疑问..

由于

1 个答案:

答案 0 :(得分:1)

像大多数表现建议一样,这里的答案是“它取决于”。两者都有效,它实际上取决于您的内容和渲染模式。

这里的经典性能参考是 Windows to Reality:从Gamefest 2007中充分利用游戏中的Direct3D 10图形

如果处理大量常量,如果您的数据分散并作为更新周期的一部分收集,则DYNAMIC常量缓冲区的Map更好。如果所有常量都已在系统内存中正确布局,则UpdateSubResource可能更好。如果你多次重复使用相同的CB一帧并映射/锁定它,那么你可能会遇到使用Map {Lock'重命名的限制UpdateSuResource问题较少,所以“它取决于”这里真的是答案

当然,所有这一切都在DirectX 12的窗口中出现,它具有完全不同的机制来处理相当于动态更新。