2011-11-26 2 views
1

방금 ​​XNA를 사용하기 시작했으며 지금은 초보자 문제가 있습니다. 내가 그리는 객체에는 자체 정점 버퍼가 있으므로 ~ 50k 개의 객체가있을 때 fps는 극적으로 감소합니다 (60에서 5/12). XNA 초보자 : 버텍스 배열을 단일 버텍스 버퍼에 병합하는 방법

가 나는 덩어리로 내 정점을 병합해야하는 팁을 가지고,하지만 난

내가 코드 예제를 얻을 수있는 모든 도움을 주셔서 감사합니다겠습니까 .. 그렇게하는 방법을 모르겠어요.

편집 : 이것은 당신이 비슷한을 가지고 그들을 병합하려면 블라

var cubes = newChunk.Where(c => c != null && !badIndex.Contains(c.BlockType)); 
VertexPositionColorTextureNormal[] verts = new VertexPositionColorTextureNormal[cubes.Sum(c => c.Vertices.Count)]; 
int VertexOffset = 0; 
var inTheRightOrder = cubes; 
foreach (var cube in inTheRightOrder) 
{ 
    var cb = cube.Vertices.ToArray(); 
    for (int v = 0; v < cb.Length; v++) 
    { 
     verts[VertexOffset + v] = cb[v]; 
    } 

    VertexOffset += cb.Length; 
} 
VertexBuffer newVB = new VertexBuffer(device, VertexPositionColorTextureNormal.VertexDeclaration, verts.Length, BufferUsage.WriteOnly); 
newVB.SetData(verts); 
var ck = new Cube { Vertices = verts, BoundingBox = BoundingBox.CreateFromPoints(verts.Select(i => i.Position)), Buffer = newVB, Cubes = cubes.Count() }; 
Cubes.Add(ck); 
+1

50,000 개체? 오브젝트를 그리기 전에 오브젝트를자를 필요가 있습니다. – Blau

+1

오브젝트는 가시적 인 정점으로 만 만들어 지므로 큐브가 맨 위에서 만 보이면 맨 위의 정점 만 만들어집니다. – NoLifeKing

답변

1

의 도움으로 함께했다 코드입니다.

int NumVerts = Objects.Sum(o => o.Vertex.Length); 
int NumIndexes = Objects.Sum(o => o.Index.Length); 

VertexPositionColor[] Vertex = new VertexPositionColor[NumVerts]; 
int[] Index = new int[NumIndexes]; 

int VertexOffset = 0; 
int IndexOffset = 0; 
foreach (Object object in Objects) 
{ 
    for (int v=0; v<object.Vertex.Length; v++) 
    { 
     Vertex[VertexOffset+v] = object.Vertex[v] + VertexOffset; 
    } 

    for (int i=0; i<object.Index.Length; i++) 
    { 
     Index[IndexOffset+i] = object.Index[i] + VertexOffset; 
    } 

    VertexOffset += object.Vertex.Length; 
    IdnexOffset += object.Index.Length; 
} 
+0

고맙습니다.이 말은 제게 많은 의미가 있습니다. 이제는 모든 투명 블록을 분할해야합니다. 그래서 다른 모든 블록이 렌더링 된 후에 그립니다. – NoLifeKing