Unity – 性能優化之小測試

自從上次去了Unity大會,在張鑫先生提到的數個優化動作之中,看到了一個令我十分在意的東西。
在那之後一直擱在心上,終於下定決心(這有啥好下決心的!!)來做個小測試~

項目

1. cache transform 組件

2. 有無 OnGUI() 的差異

1. cache transform 組件

●目標:

把平常直接使用的:

var pos = transform.position;

改為:

var pos = myCachedTransform.position;

●鳩竟這兩個有啥差別?

簡單來說,GameObject.transform 其實是一個 property
因為它又會去呼叫另一個 function 取得實體的 transform,而非直接回傳一個既定的變數,所以頻繁使用的話,額外的開銷就會出現了!

有興趣的朋友,可以使用 ILSpy 之類的工具去看看它裡面做的事情就會更了解🙂

●優化原理

基本上,無論呼叫幾次gameObject.transform回傳的實體都是同樣的,那麼事先cache起來便可。

●測試

直接使用的版本:

public class TestUnit : MonoBehaviour
{
    void Update()
    {
        var t = this.transform;
        t = this.transform;
        t = this.transform;
        t = this.transform;
        t = this.transform;
    }
}

cache 使用的版本:

public class TestUnit : MonoBehaviour {

	Transform myTransform;

	void Start()
	{
		myTransform = transform;
	}

	void Update ()
	{
		var t = this.myTransform;
		t = this.myTransform;
		t = this.myTransform;
		t = this.myTransform;
		t = this.myTransform;
	}
}

●結果

●結論

頻繁使用該物件的地方,就是先把該物件cache起來,理論上就會避免這種不必的開銷。
※這也可延伸至其他是property的變數。例如:transform.position。

2. 有無 OnGUI() 的差異

●目標:

清除畫面上明明就沒有任何GUI的玩意,仍然會佔取CPU的傢伙!

●測試:

空物件版本:

public class TestUnit : MonoBehaviour
{
}

外加一個空白OnGUI的版本:

public class TestUnit : MonoBehaviour
{
    void OnGUI()
    { }
}

●結果

整個顯而易見吧?
實際上是被GUI.Begin()和GUI.End()所佔據,function本身是無辜的~~

●結論

非必要避免使用OnGUI(),即使它裡面甚麼事情都沒做!
如需使用,請盡可能集中到同一個OnGUI()底下執行繪製,好避免Begin End的開銷。

後記

基本上,這種程式碼上的性能優化還是蠻有限的,只能加減省一下而已XD
畢竟少一個drawCall都可能勝過這堆優化…哈哈!

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s