XNA可以处理多少(低多边形)模型?

Nec*_*tem 6 c# xna xna-4.0

我知道以下是一个模糊的问题,但我遇到了我在XNA中没有预料到的性能问题.

我有一个低多边形模型(它有18个面和14个顶点),我试图绘制到屏幕a(高!)次.我得到超过60 FPS(在一台体面的机器上),直到我画这个模型5000+次.我在这里问得太多了吗?我非常希望至少将这个数字增加一倍或三倍(10-15k).

我实际绘制模型的代码如下.我试图从绘制周期中尽可能多地消除计算,是否有更多可以从中挤出,或更好的替代方案?

注意:tile.Offset在初始化期间计算一次,而不是每个周期计算一次.

foreach (var tile in Tiles)
        {
            var myModel = tile.Model;
            Matrix[] transforms = new Matrix[myModel.Bones.Count];
            myModel.CopyAbsoluteBoneTransformsTo(transforms);

            foreach (ModelMesh mesh in myModel.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    // effect.EnableDefaultLighting();
                    effect.World = transforms[mesh.ParentBone.Index] 
                                 * Matrix.CreateTranslation(tile.Offset);
                    effect.View = CameraManager.ViewMatrix;
                    effect.Projection = CameraManager.ProjectionMatrix;
                }
                mesh.Draw();
            }
        }
Run Code Online (Sandbox Code Playgroud)

And*_*ell 15

你明显达到了批量限制.有关详细信息,请参阅此演示文稿此答案以及此答案 简单地说:每秒可以向GPU提交多少个绘图调用是有限制的.

批量限制是基于CPU的限制,因此您可能会看到,一旦到达5000+型号,您的CPU就会被挂起.更糟糕的是,当您的游戏正在进行其他计算时,它将减少提交这些批次的CPU时间.

(而且重要的是要注意,相反,你几乎肯定没有达到GPU限制.不需要担心网格复杂性.)

有多种方法可以减少批次数.Frustrum剔除是一个.在你的案例中最好的一个是几何实例,这可以让你在一个批次中绘制多个模型.这是一个执行此操作的XNA示例.

更好的是,如果它是静态几何体,你可以简单地把它全部烧成一个或几个大网格吗?

  • +1正是我所说的.我强烈推荐XNA Sample,你可以很容易地修改它来绘制你自己的模型. (2认同)