2011-08-27 101 views
15

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

下面是一些东西,我发现:使用array insted的的list<>将提高性能很多

  • (C#),如果你想访问数据(甚至许多数额巨大:具有阵列20000个物品给几乎180%FPS使用for代替foreach将提高性能的20000
  • (C#)名单。在相同的20000元就好像5-10%的差异。
  • (XNA和C#)调用方法性价比高,所以当我将代码分散到meth中ods叫什么其他方法等等,一切都非常酷,面向对象,每次调用1-3 FPS的成本。
  • (xna)更新与绘制:当我将代码放入update()和draw()时,性能没有区别,所以如果您不太在意,则不必在update()而不是把所有东西放在一起画()以期望更好的FPS。
  • (xna)不知道它是我还是4.0,但是当你加载一个带有很多纹理和相当复杂的网格的.X文件时,需要花费很多时间来加载。我不得不编写自己的.X加载器和网格/模型渲染器,只是因为XNA开始为每个三角形加载纹理,而不管之前的纹理是否具有相同的纹理。即使编写我自己的为内容缓存纹理的内容加载器也不是解决方案,因为它仍然被大量使用。如果你制作的东西不错而蓬松,我建议使用drawuserprimitives而不是Model类。 (不知道它是4.0还是3.1也有这样的性能问题)
  • (xna和c#)尽量避免在绘图时使用“new”。我在网上看到了一些代码,复制/粘贴了什么,并且有“basicEffect = new BasicEffect(graphicsDevice);”和draw()中的这种丑陋,甚至更糟糕:在draw()中的迭代中。这样会杀死性能。而不是在“游戏”或静态类中有一个这样的类。这也适用于其他“临时对象”:丑陋,但我认为创建全局的东西并注意使用它会更好,然后制作一个漂亮而蓬松的代码,因为垃圾回收器会使我们的游戏变得更加美观。

好了,所以使长话短说,请在这里发表一些好的建议,所以我/我们能好,速度快,优化游戏;)

在此先感谢: Zéiksz

+0

看起来像一个很好的CW候选人:) – BlackBear

+1

我建议使这个社区维基。 – Ben

+3

我不买那使用坚实的OOP架构每次呼叫花费1-3 fps ... – Blindy

回答

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

经验法则是 “优化前的个人资料”。

+0

+1我喜欢这个网站,感谢您的分享。 –

+6

网站似乎是死于截至8月24日。 – Inisheer

7

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

直到遇到问题,请不要优化。难道你不认为游戏的可玩性比这个指标或其他指标更重要吗?我的建议是首先制作游戏,然后根据需要考虑它的表现不佳。

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

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

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

+0

我同意预编程优化是否定的。但是,我认为针对遇到此问题的人提出问题/答案会有所帮助。 –

+0

@erik我也同意这一点。这是收集这些信息的好地方。 –

+0

+1我完全同意这个答案。遇到性能问题的人几乎肯定会做出严重错误的事情,应该运行分析器来查找它,或者发布有关特定问题的信息。如果你遇到问题,合并你的一半方法调用是不会有帮助的。 –

7

我的2美分的价值:

不要把所有的代码在一个方法,因为你认为它的成本要调用的方法。如果你认为通过调用一个空方法失去1-3 FPS,你可能还没有完成1-3的损失研究。为了在空白方法调用期间实现这种损失,您必须在MANY数千...中拥有一个FrameRate ....您不会担心自己会降低1-3级。

FPS是判断XNA性能的坏方法。当启用可变时间步时,操作系统所涉及的其他进程可能会影响帧速率。你真的需要配置文件。只需专注于通过使用System.Diagnostic.Stopwatch对象计时来完成更新& /或绘制方法所需的实际时间。分别计时,不合(非常重要)。

不应仅在绘图调用中避免使用'新'关键字,而且在更新&的任何地方绘制...仅适用于参考类型。随时随地使用新关键字,以及使用值类型。