2012-03-29 110 views
6

我使用C#编程一个游戏,因此,我非常关心性能。类VS参考结构

我想知道什么是主要的区别,如果可能的话,使用一个Class来传递数据或者一个通过引用传递的结构的性能考虑。我希望不要复制数据,出于性能方面的原因(我认为通过ref的速度比通过这里的值快得多)。

我知道一个类总是通过引用传递,并且一个结构体是通过值传递的,但我在这里指的是通过引用传递结构体。

我要传递的数据的一个例子:

public delegate void PathCompleteDelegate(List<PathFinderNode> path); 
public struct PathFinderJob{ 
    public PathCompleteDelegate callback; 
    public Vector3 start, end; 
    public PathSize unitSize; 
    public BoxCollider boxCollider; 
} 

在前面的例子中,将使用类有所作为?如果是这样,那么区别是什么?在这个例子中,类会比结构更快吗?为什么?

谢谢。 若昂卡洛斯

+1

您是否尝试过对两种方法进行性能分析?如果结构的作用域在方法之外,它就会在堆上(如堆中的类中所包含的那样)。我会怀疑类或ref结构在方法调用方面是相同的性能。 – 2012-03-29 10:11:19

+0

我没有太多的经验分析,并且我使用Unity3D内置的分析器进行了快速分析检查,但是,我没有看到区别,但是,我不知道内置分析器有多好用这种“小鱼” ,或者如果在所有其他与游戏相关的分析中发现差异。 – 2012-03-29 10:15:07

+0

在用OO语言编程时,我不会浪费时间在结构上。 **我**在获得性能问题之前会面临的问题是**未完成**游戏。类和对象增加了IMO的开发速度。 – Bitterblue 2013-11-08 14:55:47

回答

4

你的代表收到一个参考类型 - List,所以你通过引用传递整个列表。

按价值传递大型结构肯定比传递参考价格贵。当你有一个庞大的结构时,将它用作结构通常是没有意义的,把它变成一个班级。

无论如何,你是肯定你会在这里有一个性能问题?看起来像一个非常不成熟的优化。

+0

我正在编写游戏,并且也在学习如何编写更快的代码。这个确切的步骤不是什么大问题,因为最多不会有超过1000个寻道请求每秒(我假设)。但是在探路者节点结构中,这可以很好地扩展到100nodes * 1000pathFindingRequests,并且了解这可能对此有所帮助。 – 2012-03-29 10:19:55

+0

解除引用100个节点1000次 - 即100,000次解除引用,一秒不应造成任何类型的麻烦。 – zmbq 2012-03-29 11:03:03

+0

如果事实证明他的游戏滞后,分析可能会揭示一些负责的代码行。现在的电脑确实非常快。 – fabspro 2012-06-06 08:09:30

7

我知道,一个阶级总是被引用和一个结构是 按值传递过去了,但我谈论参照 路过这里的结构。

您可能有正确的想法,但这是不正确的。除非您使用ref关键字,否则C#中的所有内容都按值传递。

类实例是引用类型,结构实例是值类型。

当您通过值传递引用类型时,会传递引用(小)的副本。当您按值传递值类型时,会传递整个数据的副本(可能很大)。

Jon Skeet对这一切都有很好的解释here