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

2021-08-31 09:48:24 字數 1501 閱讀 7622

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元件配合使用,以獲得更佳效能。

參考:unity官方論壇

Unity3D常用移動方法

一 向量相加減控制移動 transform.position transform.forward time.deltatime 5f 二 translate控制移動 transform.translate vector3.forward time.deltatime 5f 三 差值控制移動 當前位置...

Unity3D學習筆記之UGUI Canvas

rander mode 渲染模式 預設 screen space overlay 螢幕空間疊加模式 自動填充場景,使canvas自動適應game視窗的大小,並且在此模式下rect transform元件不可編輯,其中的所有值將由canvas自動設定 pixel perfect 開啟時,ui元素將在渲...

unity 3d學習筆記

1.日誌輸出 如果需要觀測webplayer執行時輸出的log,則可以在初始化start中加上下面這樣一段 但是此日誌檔案太大,過於冗餘 playersettings.useplayerlog true 2.場景切換 3.資源載入 所有通過resources類載入的資源必須放在名為resources...