【问题标题】:XNA game performanceXNA游戏性能
【发布时间】:2011-11-05 06:37:10
【问题描述】:

我正在使用 C# 2010 和 XNA 4.0 编写游戏。我希望它是一款好游戏,而不是一些“只是另一个废话”,所以我的目标之一是良好的帧率。为此,我想请教您一些建议,无论是 XNA 相关还是 C# 相关 - 我可以做些什么来加快我的代码并提高 FPS。

这是我发现的一些东西:

  • (c#) 使用 array insted 或 list<> 将大大提高性能,以防您想要访问大量数据(甚至很多:拥有 20000 个项目的数组提供了几乎 180% 的 FPS 列表20000。
  • (c#) 使用for 而不是foreach 将提高性能。在相同的 20000 个元素上,差异大约为 5-10%。
  • (xna 和 c#)调用方法会降低性能,所以当我将代码分散到调用其他方法的方法中时,一切都非常酷且面向对象,每次调用的成本为 1-3 FPS。
  • (xna) update vs. draw:我把代码放到update()和draw()里面的时候,性能没有什么区别,所以如果你不太在意,就不用在update()下面放一些方法而不是将所有内容放在 draw() 中以希望获得更好的 FPS。
  • (xna) 不知道是我还是 4.0,但是当你加载一个包含很多纹理和非常复杂的网格的 .X 时,加载需要很长时间。我不得不编写自己的 .X 加载器和网格/模型渲染器,因为 XNA 开始为每个三角形加载纹理,而不管前一个三角形是否具有相同的纹理。即使编写我自己的缓存纹理的内容加载器也不是解决方案,因为它仍然被使用了很多次。如果你做的东西又好又蓬松,我建议使用drawuserprimitives 而不是Model 类。 (不知道是只有 4.0 还是 3.1 也有这样的性能问题)
  • (xna 和 c#) 在绘图时尽量避免使用“new”。我在网上看到了一些代码,复制/粘贴在一起的代码有“basicEffect = new BasicEffect(graphicsDevice);”以及 draw() 中的这种丑陋,甚至更糟糕的是:在 draw() 内部的迭代中。这样会扼杀性能。而不是在“游戏”或静态类中有一个这样的类。这也适用于其他“临时对象”:丑陋,但我认为最好创建一些全局的东西并注意使用它,然后编写一个漂亮而蓬松的代码,这将使我们的游戏因为垃圾收集器而变得更好。

好吧,长话短说,请在这里发表一些好的建议,这样我/我们就可以制作出优质、快速和优化的游戏;)

提前致谢: 泽伊克斯

【问题讨论】:

  • 看起来是个不错的 CW 候选人 :)
  • 我建议将其设为社区 wiki。
  • 我不相信使用可靠的 OOP 架构每次调用会花费 1-3 fps...
  • GC与它有什么关系?如果您使用相同的对象,您将分配相同的内存,无论是否在单个函数中。函数不会被 GC 处理。
  • 我会注意到,foreach 可以根据集合使用 IEnumerawhatever 接口,并且可以触发 GC。但是关于将代码结构化为方法的部分没有意义。编译器应该在适当的地方内联,即使没有,你也可以强制它。

标签: c# performance xna xna-4.0


【解决方案1】:

软件优化是一门手艺。最好的优化是基于收集到的统计数据。

在您遇到问题之前不要进行优化。你不认为游戏可玩性比这个或其他指标更重要吗?我的建议是先制作游戏,然后再考虑它在哪些方面表现不佳。

然后发布一些具体问题,我相信你会在这里得到一些关于具体问题的帮助。

同时,我建议您从以下列出的游戏开发书籍中获得更多信息:http://forums.create.msdn.com/forums/p/8642/45646.aspx

XNA Extereme 101 - 似乎是一个有趣的教程

【讨论】:

  • 我同意预编程优化是不行的。但我认为为遇到此问题的人提供问题/答案会有所帮助。
  • @erik - 我也同意这一点。这是收集这些信息的好地方。
  • +1 我完全同意这个答案。遇到性能问题的人几乎可以肯定是在做一些严重错误的事情,应该运行分析器来查找它,或者发布关于特定问题的帖子。如果您遇到问题,合并一半的方法调用不会有帮助。
  • 感谢您的建议,但我仍然认为在实施某种其他方式之前了解一些事情比在可能需要大修之后进行优化更好。问我的问题是为了知道编程时要注意什么。
【解决方案2】:

我的 2 美分价值:

不要因为你认为调用一个方法需要花费你所有的代码在一个方法中。如果您认为通过调用空方法来损失 1-3 FPS,那么您可能还没有完成对 1-3 损失的研究。为了在空方法调用期间实现这种损失,您必须拥有成千上万的 FrameRate.... 在这种情况下您不会担心 1-3 下降。

FPS 是判断 XNA 性能的不好方法。当您启用可变时间步长时,操作系统涉及的其他进程可能会影响您的帧速率。你真的需要配置文件。通过使用 System.Diagnostic.Stopwatch 对象对它们进行计时,只需关注完成更新和/或绘制方法实际花费的时间。单独计时,而不是一起计时(非常重要)。

'new' 关键字不仅应该在绘图调用中被避免,而且在更新和绘图中的任何地方都应该避免......仅限 FOR 引用类型。随时随地对值类型使用新关键字。

【讨论】:

    【解决方案3】:

    UberGeekGames 有一篇关于 XNA 优化的好文章。它主要针对 Xbox 和 WP7,但其中许多内容也适用于 PC。

    http://www.sgtconker.com/2011/05/high-end-performance-optimizations-on-the-xbox-360-and-windows-phone-7/

    原始网站已失效,但可在 Internet 存档中找到:

    Archived version of High end performance optimizations on the xbox 360 and windows phone7

    经验法则是“优化前配置文件”。

    【讨论】:

    • 网站似乎已于 12 年 8 月 24 日终止。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多