XNA游戏性能

时间:2011-08-27 22:21:30

标签: c# performance xna xna-4.0

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

以下是我发现的一些内容:

  • (c#)使用array list<>的内容会大大提高性能,以防您想要访问大量数据(甚至很多:拥有20000个项目的数组几乎占180%)列表的FPS为20000。
  • (c#)使用for代替foreach可以提高效果。在相同的20000元素上,它就像5-10%的差异。
  • (xna和c#)调用方法会降低性能,因此当我将代码分散到调用其他方法等的方法时,所有内容都非常酷且面向对象,每次调用的成本为1-3 FPS。 / LI>
  • (xna)更新与绘图:当我将代码放入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()中的迭代中。这会扼杀性能。而不是在“游戏”或静态类中有一个这样的类。这也适用于其他“临时对象”:丑陋但我认为最好创建一些全局的东西,然后注意使用它然后制作一个漂亮而蓬松的代码,这将使我们的游戏因为垃圾收集器。

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

提前致谢: Zéiksz

3 个答案:

答案 0 :(得分:7)

软件优化是一种工艺。最好的优化类型是基于收集的统计数据的证据。

在您遇到问题之前不要优化。您是否认为游戏可玩性比此指标或其他指标更重要?我的建议是首先制作游戏,然后根据自己的喜好考虑它的表现。

然后发布一些具体问题,我相信你会在具体问题上得到一些帮助。

与此同时,我建议您从游戏开发书籍中获取更多信息,例如此处列出的信息:http://forums.create.msdn.com/forums/p/8642/45646.aspx

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

答案 1 :(得分:7)

我的2美分价值:

不要将所有代码放在一个方法中,因为您认为调用方法是成本。如果你通过调用一个空方法来考虑丢失1-3 FPS,你可能还没有完成对1-3损失的研究。如果在空方法调用期间失败是真的,那么你必须拥有数千万的FrameRate ....你不会在1-3左右的时候关注自己。

FPS是判断XNA性能的不好方法。如果启用了可变时间步,则涉及操作系统的其他进程可能会影响帧速率。你真的需要改为。只需通过使用System.Diagnostic.Stopwatch对象对它们进行计时,即可专注于完成Update&amp; /或Draw Methods所需的实际时间。他们单独计时,而不是在一起(非常重要)。

“新”关键字不仅应该在绘制调用中避免,还应该在更新和放大中的任何位置。 draw ...仅供参考类型使用。随时随地使用新关键字和值类型。

答案 2 :(得分:5)

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

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

原始网站已失效,但可在互联网档案中找到:

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

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