当前位置 : 主页 > 网络安全 > 测试自动化 >

性能 – 使用顶点缓冲区绘制大量相同的模型?

来源:互联网 收集:自由互联 发布时间:2021-06-22
我面临着许多开发人员可能找到解决方案的问题. 我有一个小项目,地板设计有小立方体(100X100). 如果我超过这个限制,我的游戏遭遇重大减速和联赛! 这是我如何画地板的: //Function to
我面临着许多开发人员可能找到解决方案的问题.
我有一个小项目,地板设计有小立方体(100X100).
如果我超过这个限制,我的游戏遭遇重大减速和联赛!

这是我如何画地板的:

//Function to draw my ground ( 100 X 100 X 1)
    public void DrawGround(GameTime gameTime)
    {
        // Copy any parent transforms.
        Matrix[] transforms = new Matrix[this.model.Bones.Count];
        this.model.CopyAbsoluteBoneTransformsTo(transforms);

        //loop 1 cube high
        for (int a = 0; a < 1; a++)
        {
            //loop 100 along cube
            for (int b = 0; b < 100; b++)
            {
                //loop 100 cubic wide
                for (int c = 0; c < 100; c++)
                {
                    // Draw the model. A model can have multiple meshes, so loop.
                    foreach (ModelMesh mesh in this.model.Meshes)
                    {
                        // This is where the mesh orientation is set, as well 
                        // as our camera and projection.
                        foreach (BasicEffect effect in mesh.Effects)
                        {
                            effect.EnableDefaultLighting();
                            effect.World = transforms[mesh.ParentBone.Index] * Matrix.CreateTranslation(this.position);
                            effect.View = this.view;
                            effect.Projection = this.projection;


                        }

                        // Draw the mesh, using the effects set above.
                        mesh.Draw();
                    }
                }
            }
        }
    }

我认为最好使用[VertexBuffer]“显卡内存”,但我还没有找到我想做的教程……

你能举个例子在我的函数“DrawGround”中使用[VertexBuffer]吗?

非常感谢你!

TL;博士;

使用Hardware Instancing绘制立方体. (可选)使用View Frustum Culling以避免绘制不可见的实例.通过阅读Riemer’s Tutorial开始使用顶点和索引缓冲区.

实例化

这个想法是,顶点和索引缓冲区一次绑定到设备,然后在一次绘制调用中多次绘制.实例是一小块数据,仅包含模型实例的唯一信息.此实例数据将写入另一个顶点缓冲区,并与包含实际顶点和索引的缓冲区绑定到设备.

你怎么能利用它?

在您的情况下,您将具有以下设置:

>包含立方体网格索引的IndexBuffer
>包含立方体网格顶点的VertexBuffer
>第二个VertexBuffer,包含要绘制的所有立方体的变换
>一种特殊的输入布局,可以将实例数据考虑在内

由于您的立方体的位置不同,您甚至不必将完整的转换矩阵发送到着色器.只需发送实例位置并将其添加到顶点位置即可.您还可以为每个实例发送颜色等其他数据.

你是如何实现它的?

一个快速的谷歌搜索给了我大量的xna实例的结果,所以这应该让你开始.这里有两个看似有希望的随机结果:

> SO question on XNA instancing
> Hardware instancing for PC in XNA 4, with textures

沮丧剔除

在任何时候,场景中只有一小部分网格实际上是可见的.对象可能被另一个对象遮挡,或者完全位于玩家的视野之外.在绘制之前删除这些不可见网格的过程称为剔除.查看Frustum Culling的第二个案例:

所有与相机音量不相交的音量都是不可见的.

相机的音量是多少?正交投影具有盒子形式的边界体积.透视投影,这个盒子是锥形的,金字塔,由近和远的平面裁剪;因此看到视锥体.

你怎么能利用它?

使用视锥体来识别当前帧中不可见的实例.仅绘制与相机的视锥体相交的那些立方体.当玩家仰望天空时,渲染负荷可降低高达100%.

网友评论