C# XNA可以处理多少(低多边形)型号?

C# XNA可以处理多少(低多边形)型号?,c#,xna,xna-4.0,C#,Xna,Xna 4.0,我知道以下是一个模糊的问题,但我遇到了我在XNA中没有预料到的性能问题 我有一个低多边形模型(它有18个面和14个顶点),我尝试多次将其绘制到屏幕上(高!)。我得到了60多帧(在一台像样的机器上),直到我画这个模型5000多次。我是不是要求太高了?我非常想把这个数字至少增加一倍或三倍(10-15k) 下面给出了我实际绘制模型的代码。我已经试着从绘图周期中尽可能地减少计算量,我能从中挤出更多的计算量,还是更好的选择 注:磁砖。偏移量在初始化期间计算一次,而不是每个周期 foreach (var t

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

我有一个低多边形模型(它有18个面和14个顶点),我尝试多次将其绘制到屏幕上(高!)。我得到了60多帧(在一台像样的机器上),直到我画这个模型5000多次。我是不是要求太高了?我非常想把这个数字至少增加一倍或三倍(10-15k)

下面给出了我实际绘制模型的代码。我已经试着从绘图周期中尽可能地减少计算量,我能从中挤出更多的计算量,还是更好的选择

注:磁砖。偏移量在初始化期间计算一次,而不是每个周期

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();
            }
        }

与任何性能问题一样,特定方法的工作也有局限性。您需要测量并查看问题所在。最好的选择是使用探查器,但即使是查看CPU负载之类的基本测量也可能显示出您的NCK

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

确保您没有在调试构建上进行测量——如果应用程序受到CPU限制,它可能会显著降低应用程序的速度


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

您很明显达到了批处理限制。有关详细信息,请参见和。简单地说:每秒可以提交到GPU的draw调用数是有限制的

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

(值得注意的是,相反,你几乎肯定没有达到GPU的极限。现在还不需要担心网格的复杂性。)

有许多方法可以减少批处理数量。平截体剔除就是其中之一。在您的情况下,最好的方法可能是几何体实例化,这可以让您在一个批次中绘制多个模型。这是一个这样做的


更好的是,如果它是静态几何体,你能简单地将它全部烘焙成一个或几个大网格吗?

+1正是我所说的。我强烈推荐XNA样品,你可以很容易地修改它来绘制你自己的模型。谢谢!这听起来是对的。当我今晚下班回家时,我会尝试一下你的一些建议,看看它是如何提高性能的(如果可以的话,请将此标记为一个答案!)前面提到的演示已移至