我正在使用C# 2010和XNA 4.0编写一款游戏。我希望它是一个好游戏,而不只是"又一个垃圾游戏",因此我的目标之一是良好的帧率。为此,我想请你给出一些建议,不管是与XNA相关还是与C#相关 - 我该如何加速代码以提高FPS。
以下是我发现的一些东西:
- (c#) 使用
array
而不是list<>
可以大大提高性能,如果您要访问大量数据(甚至很多: 有20000个项目的数组比20000个列表的FPS高了近180%)。 - (c#) 使用
for
而不是foreach
会提高性能。在相同的20000个元素上,差异约为5-10%。 - (xna和c#) 调用方法会消耗性能,因此当我将代码散布到方法中并调用其他方法时,一切都很酷和面向对象,但每次调用的成本都是1-3 FPS。
- (xna) 更新 vs 绘图: 当我将代码放入update()和draw()中时,性能没有区别,因此如果您不太在意,您不必将某些方法放在update()中,而是将所有内容保持在draw()中,希望获得更好的FPS。
- (xna) 不知道是不是我自己或只是4.0,但当您加载了一个带有大量纹理和相当复杂的网格的.X文件时,需要很长时间才能加载。我不得不编写自己的.X加载器和网格/模型渲染器,因为XNA开始为每个三角形加载纹理,而不管前一个三角形是否具有相同的纹理。即使编写自己的contentloader来缓存纹理也不是解决方案,因为它仍然被频繁使用。如果您打算制作柔软漂亮的东西,我建议使用
drawuserprimitives
而不是Model
类。(不知道是否仅限于4.0,还是3.1也存在这样的性能问题)
总之,要让我们能够制作出好、快、优化的游戏,请遵循以下建议:
- 在绘制时尽可能避免使用 "new"。
- 将上述类放置在游戏类或静态类中。
- 对于其他“临时对象”,请创建全局对象并小心使用。
感谢您的阅读和理解:Zéiksz