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 具有完全不同的机制来处理等效的动态更新。
我有一个关于内存使用的问题
动态常量缓冲区 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 具有完全不同的机制来处理等效的动态更新。