2012-03-29 178 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