iT邦幫忙

0

有關ref跟return之效能問題(unity)

  • 分享至 

  • xImage

在我學unity的時候,發現了2個不同的extension Method的方法@@
在網上看到別人用的都是方法一,但是我認為方法二的寫法更為簡潔~想請問一下大家方法二比起方法一在效能上會有問題麼@@?

Vector2 v2 = Vector2.zero;
//方法一
    public static Vector2 SetX(this Vector2 vector, float x)
    {
        return new Vector2(x, vector.y);
    }
//使用方法
    v2 = v2.SetX(5);
//結果
    v2 = (5,0)
    
//方法二
    public static void SetX(this ref Vector2 vector, float x)
    {
        vector = new Vector2(x,vector.y);
    }
//使用方法
    v2.SetX(5);
//結果
    v2 = (5,0)
效能差不多,喜好問題~
有些人不喜歡在函式內改變外部狀態,有些人喜歡。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1

若是依你舉的例子

ref傳入的參數,是直接傳入該參數占用的記憶體位址,並直接對其做處理
return則是,你建立了一個新的記憶體位址,在做完動作後將資料位址回傳給呼叫者

Vector2 v2 = Vector2.zero;
//方法一
    public static Vector2 SetX(this Vector2 vector, float x)
    {
        return new Vector2(x, vector.y);
    }
//使用方法
    SetX(v2,5); //v2沒被改變,v2一樣還是 v2 = Vector2.zero;
    v2 = SetX(v2,5); //需要將SetX回傳的資料,指定回v2
    
//方法二
    public static void SetX(this ref Vector2 vector, float x)
    {
        vector = new Vector2(x,vector.y);
    }
//使用方法
    SetX(ref v2,5); //v2直接被改動
gaia2222 iT邦新手 5 級 ‧ 2022-07-19 23:58:50 檢舉

好的><明白,感謝你的回答~我只是好奇網上別人用的這種做法會不會有更深層的考慮><感謝你~

1

這個問題,認真來說。如真要討論效能問題的話。
理論上來說,直接變值一定會比傳遞變值還要好。

但實際上來說,其實兩者的差異並不在於效能上的問題。
而是記憶體的使用問題。

在討論效能問題之前,得先說說為何有這樣的寫法。及這種寫法的用意到底是為什麼。
大多數來說,都是不外乎為了「規劃性」「可攜性」「變動性」及「繼承性」
你或許可以發現。並沒有是因為「效能」
當然,這兩種寫法的「效能」還是有其差異的。
只是這樣的差異會因為使用的行為上。變成並沒那麼的需要去做比對性。

所以就單純你的問題而言來看。原則上第二種寫法會比第一種寫法的效率好。
雖然我對內部都是 new 的方式持保留態度就是了。

只是我會給你的答案是。「無法給你確定的答案」
因為並無法這樣去做說明。

gaia2222 iT邦新手 5 級 ‧ 2022-07-20 00:01:55 檢舉

感謝你的回答><你的回應讓我學懂更多~感謝你~但是我比較好奇為什麼對內部new的方式會有所保留~所做的事不是也是一樣的麼@@?

我要發表回答

立即登入回答