2014-03-13 18 views
0

我正在使用SharpDX渲染一些紋理四邊形。改變頂點數據(位置,顏色,紋理)的推薦方法是什麼?DirectX11:如何更新VertexBuffer數據

我分配的緩衝區這樣的:

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); 
} 

現在我想重新使用vertexbuffer現有的,改變位置,顏色和質地的值並再次繪製。

到目前爲止,我用的GetData()和SetData的(),但做到了這對性能:(一大負面影響

+0

如果你用CPU更新你的數據,最好的辦法是保存你的數據在CPU中(作爲一個數組),更新你的數組,然後使用緩衝區 - >複製數據 - > UnMap的地圖功能。您不需要以這種方式重新創建緩衝區。 – catflier

回答

4

不要使用的GetData新的數據獲取現有的數據,只是推到VertexBuffer各如果您需要知道VertexBuffer中的內容,請使用C#在內存中保留一份數據,而不是使用GetData獲取內存中的數據。

通常數據從CPU推送到GPU而不是反過來這允許兩個系統並行運行,GPU滯後於CPU。

如果你從GPU獲取數據並將其返回給CPU,您將創建一種情況,即CPU必須先等待數據到達,然後才能繼續。這具有敲擊的效果,即GPU隨後等待來自CPU的進一步指令。這種情況被稱爲「失速」。