Unity 2017 Game Optimization 讀書筆記(1)Scripting Strategies Part 1

1.Obtain Components using the fastest method

Unity有多種Getcomponet的方法:

GetComponent(string),

GetComponent<T>()

GetComponent(typeof(T))

哪種效率最高會跟隨Unity版本的變化而變化,對於Unity 2017,本書作者的測試是GetComponent<T>()方法最給力,和GetComponent(typeof(T))差不太多。至於GetComponent(string),可定是最差了,跟其他倆個方法有很大的差距,很容易理解,畢竟是用的是神坑的string作爲參數啊

2.Remove empty callback definitions

Awake(), Start(), Update()等Unity自帶的方法在沒使用時刪除掉。因爲即使是空方法,Unity也需要在生命週期的對應時間點去調用函數,依然會有開銷。關於Unity的生命週期,可以查看對應介紹https://docs.unity3d.com/Manual/ExecutionOrder.html

特別需要注意的是Start 和 Update方法。因爲當創建一個腳本時,Unity爲它默認的添加了這倆個方法。

例如Start()方法,雖然是在Instantiate時只調用一次,但是當同時有大量腳本需要調用各自的start方法時,就有可能會帶來Scene初始化變慢,浪費CPU導致幀率下降和卡頓。

舉個栗子,兩個物體碰撞時,我們可能會搞個特效出來,再顯示個傷害數字文本,再播個小音效等等,這一瞬間會對CPU做出很多變化,這一幀一下子要幹一堆事。但是隻有這一幀整個生命週期包括Start,Update該做的都做完了才能進行下一幀,此時就可能導致幀率下降。

作者做了個測試,30000個腳本,兩組對照組,一組沒有空的函數,一組有空的Start 和 Update,結果顯而易見。

特別需要警惕的是一個GameObject可能會有多個component,如果componet都有沒必要的空函數,後果很殘忍。

要解決這個很簡單,刪掉空函數就ok了,各家IDE工具也都支持正則,下邊這個正則就可以找到所有的空Update函數。對於OnGUI() OnEnable()等等其他函數都是同樣道理。

Update要謹慎使用,Update函數常見的使用不當的情形:(水平有限,這段有點怎麼翻譯都難翻譯出原味兒,直接看英文吧還是)

1.重複計算並不常用或根本沒用過的value

2.承擔了過多本可以共享結果的工作

3.對於一些工作其實沒必要這麼高的調用頻率

 

3. Cache Component references

在Unity編程中,重複計算是一個常見的問題,特別是對於GetComponent()這種函數消耗更大(原理在之後的第八章會講,是因爲Native內存)

比如下邊這個例子,每次計算Damage,都要重複獲取rigidbody等5個腳本的引用,這對CPU很不友好,如果要是這函數是在Update函數裏每幀都調用,那簡直是災難。

我們可以用一丟丟內存(32 or 64bits)來換取這部分性能,爲將來的使用緩存這些引用。除非有極其嚴格的內存瓶頸,毫無疑問這種方式更nice,將會節省很多CPU資源。同樣的道理對於計算Value也同樣適用,計算一次緩存下來避免多次計算,都可以提高效率。

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章