我有一个问题,通过使用
来记录使用情况动态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)
有任何性能提升或命中请帮我澄清这个疑问..
由于
答案 0 :(得分:1)
像大多数表现建议一样,这里的答案是“它取决于”。两者都有效,它实际上取决于您的内容和渲染模式。
这里的经典性能参考是 Windows to Reality:从Gamefest 2007中充分利用游戏中的Direct3D 10图形。
如果处理大量常量,如果您的数据分散并作为更新周期的一部分收集,则DYNAMIC常量缓冲区的Map更好。如果所有常量都已在系统内存中正确布局,则UpdateSubResource
可能更好。如果你多次重复使用相同的CB一帧并映射/锁定它,那么你可能会遇到使用Map {Lock'重命名的限制UpdateSuResource
问题较少,所以“它取决于”这里真的是答案
当然,所有这一切都在DirectX 12的窗口中出现,它具有完全不同的机制来处理相当于动态更新。