各頂点の 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 で作成された float 配列です。基本的に、TerrainHeight 配列全体をスキャンし、各値をメッシュ内のそれぞれの PositionNormalTextured の Z 値にコピーします。LockFlags.NoOverwrite を使用して、配列の新しいコピーを作成しないようにしましたが、LockFlags.Discard よりも高速ではないようです。
メッシュの更新には、CPU で新しい地形を計算するのと同じかそれ以上の時間がかかるため、もっと高速な方法があるはずだと思います。これについて Google で情報を見つけるのに苦労しています。頂点バッファを更新するより良い方法はありますか? 重要な場合、メッシュのサイズはユーザーが設定し、100 万を超える頂点を含めることができます (これは複数のメッシュで実現されます) が、既定の設定は 32k の頂点であり、これは単一の D3D メッシュの最大値です。