我使用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()进行了此操作,但这对性能产生了很大的负面影响:(
答案 0 :(得分:4)
不要使用GetData来获取现有数据,只需每次使用SetData将新数据推送到VertexBuffer。如果您需要知道VertexBuffer中的内容,请在C#中保留数据的副本,而不是使用GetData获取它。
通常数据从CPU推送到GPU而不是相反。这允许两个系统并行操作。随着GPU略微落后于CPU。
如果从GPU获取数据并将其返回到CPU,则会产生CPU必须等待数据到达才能继续运行的情况。这具有敲击效果,然后GPU等待来自CPU的进一步指令。这种情况被称为“失速”。