xna - 这些 C# 功能对性能有何影响?

标签 xna c#

我一直在设计一个基于组件的游戏库,总体意图是用 C++ 编写它(因为这是我的强项),并以 Ogre3D 作为后端。现在我实际上已经准备好编写一些代码了,我认为在 XNA4.0 框架下测试我的框架会快得多(获得结果/编写编辑器等更快)。然而,虽然我不是 C++ 或 C# 的新手,但在以“XNA”方式做事时,我有点新手,可以这么说,所以在我之前有一些疑问开始敲定代码:

  1. 我读到了有关使用数组而不是集合来避免性能下降的内容,然后还读到这并不完全正确,并且如果您枚举一个具体的 List<>集合(而不是 IEnumerable<> ),枚举数是用于每次迭代的值类型,并且这里没有任何 GC 担忧。相关文章早在 2007 年就已发表。这是否属实,或者经验丰富的 XNA 开发人员是否对此有现实问题?理想情况下,我希望在做太多事情之前沿着选定的路线走下去。

  2. 如果数组确实是可行的方法,那么毫无疑问,我假设在调整数组大小时,您会用新空间复制旧数组吗?或者这是不合时宜的吗?您是否尝试过永远不要调整数组的大小?如果是这种情况,GC 不会启动旧的GC,或者命中无关紧要吗?

  3. 由于该引擎是针对 C++ 设计的,因此该设计允许使用 lambda 表达式和委托(delegate)。一种设计使用 fastdelegate库是在 C++ 中使用委托(delegate)的最快方式。更灵活但稍慢的方法(尽管在 C++ 世界中几乎不明显)是使用 C++0x lambda 和 std::function 。理想情况下,我想在 XNA 中做类似的事情,并允许使用委托(delegate)。使用委托(delegate)是否会导致性能方面出现任何重大问题?

  4. 如果对委托(delegate)有性能考虑,以下之间是否有区别:

    public void myDelegate(int a, int b);
    private void myFunction(int a, int b)
    {
    }
    
    event myDelegate myEvent;
    
    myEvent += myFunction;
    

对比:

    public void myDelegate(int a, int b);

    event myDelegate myEvent;

    myEvent += (int a, int b) => { /* ... */ };

抱歉,如果我有点胡言乱语,我更愿意清楚地表达我的问题。 :)

提前致谢!

最佳答案

基本上,C# 中唯一需要注意的主要性能问题(与 C++ 中必须注意的不同)是垃圾收集器。只要不在主游戏循环中分配内存就可以了。 Here is a blog post that goes into detail .

现在回答你的问题:

1) 如果框架集合迭代器可以实现为值类型(不会产生垃圾),那么通常(总是?)就是这样。您可以放心使用foreach例如,List<> .

您可以使用CLR Profiler来验证您是否在主循环中进行分配。 .

2) 使用List s 而不是数组。他们会为您处理调整大小。您应该使用Capacity属性在开始游戏之前预先分配足够的空间以避免 GC 问题。使用数组,您只需要自己实现所有这些功能 - 丑陋!

GC 在分配时启动(不是在内存空闲时启动)。在 Xbox 360 上,每分配 1MB 就会启动,而且速度非常慢。在 Windows 上,它有点复杂 - 但对性能也没有那么大的影响。

3) C# 委托(delegate)速度非常快。而且比大多数人预期的要快。它们与接口(interface)上的方法调用相当。 Herehere这些问题提供了有关 C# 中委托(delegate)性能的更多详细信息。

我无法说出它们与 C++ 选项相比如何。你必须测量它。

4) 不。我相当确定这段代码会产生相同的 IL。不过,您可以拆卸它并检查或分析它。

我可能会补充 - 没有检查自己 - 我怀疑有一个 event myDelegate会比普通 myDelegate 慢如果您不需要 event 的所有魔力.

关于xna - 这些 C# 功能对性能有何影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7799803/

相关文章:

c# - MonoGame/XNA 在 Spritebatch 中绘制多边形

c# - 如何从头开始创建模型

c# - 如何多次旋转游戏对象

c# - F# 中的事件和委托(delegate)

c# - 有没有工具可以将一些 C++ 类打包到 C# 中?

c# - 切开声音效果/静音的开始

multithreading - C# : UDP Listener Thread

c# - 如果我尝试播放mp3文件,我的代码会崩溃,对于WAV文件效果很好

c# - Youtube全屏在WinForms webBrowser中不起作用

c# - 减少 regex/linq 的 2 GB 内存占用或解决获取不同组值的问题