DirectX11:如何更新VertexBuffer数据

时间:2014-03-13 11:58:39

标签: .net directx-11 sharpdx

我使用SharpDX渲染一些纹理四边形。改变顶点数据(位置,颜色,纹理)的推荐方法是什么?

我像这样分配缓冲区:

var vertexBuffer = SharpDX.Toolkit.Graphics.Buffer.Vertex.New(graphicsdevice, vertecpositiontexturecolor);

var vertexInputLayout = VertexInputLayout.FromBuffer(0, vertexBuffer);

然后像这样画出来:

foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
    pass.Apply();
    graphicsdevice.Draw(PrimitiveType.TriangleStrip, vertexBuffer.ElementCount);
}

现在我想重用现有的顶点缓冲区,更改位置,颜色和纹理的值并再次绘制。

到目前为止,我使用GetData()和SetData()进行了此操作,但这对性能产生了很大的负面影响:(

1 个答案:

答案 0 :(得分:4)

不要使用GetData来获取现有数据,只需每次使用SetData将新数据推送到VertexBuffer。如果您需要知道VertexBuffer中的内容,请在C#中保留数据的副本,而不是使用GetData获取它。

通常数据从CPU推送到GPU而不是相反。这允许两个系统并行操作。随着GPU略微落后于CPU。

如果从GPU获取数据并将其返回到CPU,则会产生CPU必须等待数据到达才能继续运行的情况。这具有敲击效果,然后GPU等待来自CPU的进一步指令。这种情况被称为“失速”。