我有一个地形网格,每帧只需要更新每个顶点的 Z 值。我当前的方法如下所示:
int stepping = CustomVertex.PositionNormalTextured.StrideSize / 4;
//ZPtr points to the Z value of the first PositionNormalTextured in the mesh.
//This way we don't have to dereference ->Z for each vertex.
float* ZPtr = &(((CustomVertex.PositionNormalTextured*)
TerrainMesh.LockVertexBuffer(LockFlags.NoOverwrite).InternalDataPointer)->Z);
float* DPtr = TerrainHeight; //point to begin scanning result
float* EndPtr = DPtr + TerrainMesh.NumberVertices; //point to stop scanning result
do { *ZPtr = *DPtr; ZPtr += stepping; } while (++DPtr < EndPtr); //copy data
TerrainMesh.UnlockVertexBuffer(); //unlock
这里,TerrainHeight 是一个使用 Marshal.AllocHGlobal 创建的浮点数组,表示地形高度。基本上,它扫描整个 TerrainHeight 数组并将每个值复制到网格中相应 PositionNormalTextured 的 Z 值。我使用 LockFlags.NoOverwrite 来避免创建数组的新副本,尽管这似乎并不比 LockFlags.Discard 快。
更新网格所需的时间与在 CPU 中计算新地形所需的时间一样长或更长,这让我相信应该有更快的方法。我一直无法在 Google 上找到有关此的信息。有没有更好的方法来更新顶点缓冲区?如果重要的话,网格的大小是用户设置的,可能包括超过一百万个顶点(这是通过多个网格完成的),但默认设置是 32k 顶点,这是单个 D3D 网格的最大值。