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

时间:2011-03-11 02:04:57

标签: c# xna xna-4.0

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

我有一个低多边形模型(它有18个面和14个顶点),我试图在屏幕上绘制一个(高!)次。我得到超过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();
            }
        }

2 个答案:

答案 0 :(得分:15)

您已明确达到批量限制。有关详细信息,请参阅this presentationthis answer以及this answer。简单地说:每秒可以向GPU提交多少个绘图调用是有限制的。

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

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

有多种方法可以减少批次数量。 Frustrum剔除是一个。在您的情况下,最好的一个是几何实例化,这使您可以在一个批次中绘制多个模型。这是XNA sample执行此操作。

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

答案 1 :(得分:3)

与任何性能问题一样,特定方法的工作方式存在限制。您需要测量并查看问题所在。最好的选择是使用分析器,但即使像查看CPU负载这样的基本测量也可能显示出你有什么瓶颈。

作为第一个调查步骤,我建议删除所有计算(如矩阵乘法)并看到你得到改进 - 这意味着CPU仍然比GPU做更多的工作。

确保您没有对调试版本进行测量 - 如果它受CPU限制,它可能会使应用程序显着变慢。

附注:当您相对不频繁地发送大型操作时,GPU效果最佳。您的代码或多或少地相反 - 发送大量非常小的绘图请求。您应该能够批处理原语并获得更好的性能。有关如何渲染大量简单对象(包括DirectX SDK中的对象)的示例,搜索“gpu渲染人群”可以为您提供起点。