1. 程式人生 > >unity3D筆記之十五 移動遊戲優化貼士

unity3D筆記之十五 移動遊戲優化貼士

String是一個很常用的引用型別物件。當代碼裡存在字串拼接、直接或間接呼叫ToString()函式時,會生成字串的副本,也就產生了記憶體分配。例如:呼叫Object.name屬性,即使每次返回值是固定的,依然是不同的String物件,因為這裡每次返回都是一個物件拷貝。所以建議可以通過把這類字串預先快取,或者在打包時生成一個名字的列表作為靜態資料,提供給執行時的邏輯直接讀取。

部分Unity內建API在被呼叫時,都是返回物件拷貝。例如:Getcomponents、Sprite.Vertices、Input.Touches等。從設計角度是考慮程式碼安全性,防止外部直接去修改真正的物件資料。所以,這些屬性返回值要做快取。或者通過其他API來實現需求從而規避掉這個問題。

ParticleSystem API在Unity 2017.2之前的版本中,Stop和Simulate內部實現使用了閉包。粒子系統的一些API,例如:Start、Stop、Pause、Clear、Simulate在呼叫它們時會遞迴呼叫當前粒子節點下面的所有子級節點,並會觸發GetComponent,這帶來了一定的CPU開銷。如果需要調這幾個方法的時候,函式引數withChildren可以設為false,不觸發遍歷子節點。在粒子物件初始化時,預存子節點,在需要時直接根據快取的子節點列表分別呼叫它們的Start。

Canvas都建議做動靜分離,頻繁改動的元素和固定不變的元素分開到不同的Canvas。需要注意Canvas數量,數量多少根據UI的複雜程度、動靜分離的Canvas個數進行測試,評估多少個Canvas是合理的。目前發現Unity2017.3中,出現過當Canvas數量達到十幾個或更多時,帶來的開銷反而比不分拆時還大。

當我們需要手動釋放一些物件的記憶體時,會有很多種方式,Unity提供了很多解除安裝各種資源的函式。主動調GC.collect是不必要的,如果一個物件的引用不是Null時,是不可能釋放它的。GC只需要做好物件引用的清理就可以,剩下的還是由GC機制自動管理更好。我們可以通過自定義記憶體池和資源管理器,來很精細的控制每一種資源的生命週期。   AssetBundle壓縮格式一般使用LZ4,但要注意AssetBundle的合理Unload時機。而LZMA格式,由於存在載入時解壓後重壓縮為LZ4的開銷,一般情況下不建議使用。主Bundle解除安裝時,與它關聯的依賴Bundle一定要根據引用計數來控制是否可以解除安裝,否則依賴Bundle的Asset容易引發記憶體洩露。

啟用靜態批處理將有助於效能的提升。在《Cubiques立體迷宮》中大多數的場景遊戲物件都是靜態的,這意味著唯一真正運動的物體主要是立方體角色。要啟用靜態批處理,只需將每個物件都設定為靜態的,這是每個遊戲物件都具有的屬性,並且可以通過檢視視窗進行設定。還要確保執行設定中在渲染部分啟用靜態批處理。

Rect Mask 2D是一種UI元件,與Mask元件類似。不同的是前者可以在UI元素超出遮罩區域時禁用這個元素,從而避免多餘的渲染工作。

另一種UI元件Scroll Rect是用來顯示大量內容的,它會隱藏部分內容並允許使用者進行滾動操作。這種元件的互動可以給玩家帶來更佳體驗,但儘量少用,因為它對移動設別並不是特別友好。可以將其與Rect Mask 2D元件配合使用,以獲得更佳效能。