【问题标题】:How many (low poly) models can XNA handle?XNA 可以处理多少个(低多边形)模型?
【发布时间】:2011-07-13 04:43:07
【问题描述】:

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

我有一个低多边形模型(它有 18 个面和 14 个顶点),我试图在屏幕上绘制(高!)次。在我绘制这个模型 5000 多次之前,我得到了超过 60 FPS(在一台像样的机器上)。我在这里问太多了吗?我非常希望至少将这个数字增加一倍或三倍(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();
            }
        }

【问题讨论】:

    标签: c# xna xna-4.0


    【解决方案1】:

    您显然达到了批量限制。有关详细信息,请参阅 this presentationthis answerthis answer。简而言之:每秒可以向 GPU 提交的绘制调用数量是有限制的。

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

    (重要的是要注意,相反,您几乎可以肯定没有达到 GPU 限制。无需担心网格复杂性。)

    有多种方法可以减少批次计数。截锥体剔除就是其中之一。在您的情况下,最好的方法可能是 Geometry Instancing,这可以让您在一个批次中绘制多个模型。这是一个 XNA sample 这样做。

    更好的是,如果它是静态几何体,您可以简单地将其全部烘焙到一个或几个大网格中吗?

    【讨论】:

    • +1 正是我想说的。我强烈推荐 XNA Sample,你可以很容易地修改它来绘制你自己的模型。
    • 谢谢!这听起来是对的。当我今晚下班回家时,我会尝试你的一些建议,看看它如何提高性能(如果有,请将其标记为答案!)
    • 上述演示文稿已移至ce.u-sys.org/Veranstaltungen/…
    【解决方案2】:

    与任何性能问题一样,特定方法的工作存在限制。您需要衡量并查看问题出在哪里。最好的选择是使用分析器,但即使是查看 CPU 负载等基本测量也可能会显示您遇到的瓶颈。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多