gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:27:35 25 4
gpt4 key购买 nike

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

Dynamic ConstantBuffer vs Constant Buffer updated frequencylky(Using Defualt usagetype) 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() 更新它们,他已将用法定义为动态

例如 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) 时使用 Dynamic Constant buffer(eg2) 而不是默认的 ConstatnBuffer updatee 是否有任何性能提升或影响??

请帮我解决这个疑问..

谢谢

最佳答案

与大多数性能建议一样,这里的答案是“视情况而定”。两者都有效,这实际上取决于您的内容和渲染模式。

此处的经典性能引用是 Windows to Reality:在您的游戏中充分利用 Direct3D 10 图形 来自 Gamefest 2007 .

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

当然,所有这些都在 DirectX 12 中消失了,DirectX 12 具有完全不同的机制来处理等效的动态更新。

关于c++ - C++ 和 DX11 中的动态常量缓冲区或动态顶点缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28248901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com