XNA游戏性能

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

这是我发现的一些东西:

  • (c#)使用list array将大大提高性能,以防你想要访问大量数据(甚至很多:拥有20000个项目的数组给出了近200%的FPS列表的180%。
  • (c#)使用for而不是foreach将提高性能。 在相同的20000元素上,它就像5-10%的差异。
  • (xna和c#)调用方法会降低性能,因此当我将代码分散到调用其他方法等的方法时,一切都非常酷且面向对象,每次调用的成本为1-3 FPS。
  • (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

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

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

原始网站已经死亡,但可以在Internet Archive中找到:

在xbox 360和windows phone7上进行高端性能优化的存档版本

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

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

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

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

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

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

我的2美分价值:

不要将所有代码放在一个方法中,因为您认为调用方法是成本。 如果你通过调用一个空方法来思考你输掉1-3 FPS,你可能还没有完成对1-3丢失的研究。 因为在空方法调用期间失败是真的,你必须拥有数千万的FrameRate ….在那里你不会关心1-3下降。

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

‘new’关键字不仅应该在绘制调用中避免,还应该在更新和绘制中的任何位置避免…仅限FOR引用类型。 随时随地在值类型中使用新关键字。