Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XNA初学者:如何将顶点数组合并到单个顶点缓冲区中_C#_Xna_Vertices - Fatal编程技术网

C# XNA初学者:如何将顶点数组合并到单个顶点缓冲区中

C# XNA初学者:如何将顶点数组合并到单个顶点缓冲区中,c#,xna,vertices,C#,Xna,Vertices,我最近刚开始使用XNA,现在我面临一个初学者的问题,性能。我绘制的对象有自己的顶点缓冲区,因此当我有~50k对象时,fps会急剧下降(从60下降到5-12) 我得到一个建议,我应该把顶点合并成块,但我不知道怎么做 如果我能从代码示例中得到任何帮助,我将不胜感激 编辑:这是我在Blau的帮助下想出的代码 var cubes = newChunk.Where(c => c != null && !badIndex.Contains(c.BlockType)); VertexPo

我最近刚开始使用XNA,现在我面临一个初学者的问题,性能。我绘制的对象有自己的顶点缓冲区,因此当我有~50k对象时,fps会急剧下降(从60下降到5-12)

我得到一个建议,我应该把顶点合并成块,但我不知道怎么做

如果我能从代码示例中得到任何帮助,我将不胜感激

编辑:这是我在Blau的帮助下想出的代码

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);
var cubes=newChunk.Where(c=>c!=null&&!badIndex.Contains(c.BlockType));
VertexPositionColorTextureNormal[]verts=新的VertexPositionColorTextureNormal[cubes.Sum(c=>c.Vertices.Count)];
int顶点偏移=0;
var in RightOrder=立方体;
foreach(按正确顺序排列的变量多维数据集)
{
var cb=cube.Vertices.ToArray();
对于(int v=0;vi.Position)),Buffer=newVB,Cubes=Cubes.Count();
添加(ck);

要将它们合并,您必须使用类似的方法

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;
}
intnumverts=Objects.Sum(o=>o.Vertex.Length);
int NumIndexes=Objects.Sum(o=>o.Index.Length);
VertexPositionColor[]顶点=新的VertexPositionColor[NumVerts];
int[]索引=新的int[NumIndexes];
int顶点偏移=0;
int IndexOffset=0;
foreach(对象中的对象)
{

对于(intv=0;v要合并它们,您必须使用类似于此的内容

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;
}
intnumverts=Objects.Sum(o=>o.Vertex.Length);
int NumIndexes=Objects.Sum(o=>o.Index.Length);
VertexPositionColor[]顶点=新的VertexPositionColor[NumVerts];
int[]索引=新的int[NumIndexes];
int顶点偏移=0;
int IndexOffset=0;
foreach(对象中的对象)
{

对于(int v=0;v50.000对象?绘制前可能需要剪裁对象…对象仅由可见顶点构成,因此如果立方体仅从顶部可见,则仅生成顶部顶点。50.000对象?绘制前可能需要剪裁对象…对象仅由可见顶点构成,因此,如果立方体仅从顶部可见,则只制作顶部顶点。谢谢,这对我来说意义重大,现在我要分割所有透明块,所以我在所有其他块渲染后绘制它们。谢谢,这对我来说意义重大,现在我要分割所有透明块,所以我在所有其他块渲染后绘制它们。