XNA游戏性能

Zéi*_*ksz 15 c# performance xna xna-4.0

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

这是我发现的一些东西:

  • (c#)使用arrayinsted list<>会大大提高性能,以防你想要访问大量数据(甚至很多:拥有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

Pre*_*gha 7

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

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

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

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

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


Ste*_*e H 7

我的2美分价值:

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

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

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


Dav*_*ile 5

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上进行高端性能优化的存档版本

经验法则是"优化之前的概况".

  • 截至6月24日,网站似乎已经死亡. (6认同)