【发布时间】:2011-11-05 06:37:10
【问题描述】:
我正在使用 C# 2010 和 XNA 4.0 编写游戏。我希望它是一款好游戏,而不是一些“只是另一个废话”,所以我的目标之一是良好的帧率。为此,我想请教您一些建议,无论是 XNA 相关还是 C# 相关 - 我可以做些什么来加快我的代码并提高 FPS。
这是我发现的一些东西:
- (c#) 使用
arrayinsted 或list<>将大大提高性能,以防您想要访问大量数据(甚至很多:拥有 20000 个项目的数组提供了几乎 180% 的 FPS 列表20000。 - (c#) 使用
for而不是foreach将提高性能。在相同的 20000 个元素上,差异大约为 5-10%。 - (xna 和 c#)调用方法会降低性能,所以当我将代码分散到调用其他方法的方法中时,一切都非常酷且面向对象,每次调用的成本为 1-3 FPS。
- (xna) update vs. draw:我把代码放到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() 内部的迭代中。这样会扼杀性能。而不是在“游戏”或静态类中有一个这样的类。这也适用于其他“临时对象”:丑陋,但我认为最好创建一些全局的东西并注意使用它,然后编写一个漂亮而蓬松的代码,这将使我们的游戏因为垃圾收集器而变得更好。
好吧,长话短说,请在这里发表一些好的建议,这样我/我们就可以制作出优质、快速和优化的游戏;)
提前致谢: 泽伊克斯
【问题讨论】:
-
看起来是个不错的 CW 候选人 :)
-
我建议将其设为社区 wiki。
-
我不相信使用可靠的 OOP 架构每次调用会花费 1-3 fps...
-
GC与它有什么关系?如果您使用相同的对象,您将分配相同的内存,无论是否在单个函数中。函数不会被 GC 处理。
-
我会注意到,foreach 可以根据集合使用 IEnumerawhatever 接口,并且可以触发 GC。但是关于将代码结构化为方法的部分没有意义。编译器应该在适当的地方内联,即使没有,你也可以强制它。
标签: c# performance xna xna-4.0