Unity UI效能優化技巧

2022-02-04 17:44:50 字數 3214 閱讀 9453

本文將介紹一些提公升unity ui效能的技巧。更多優化技巧,可以**unity工程師ian dundore在unite europe 2017的演講《使用unity效能提公升技巧》。

畫布(canvas)是unity ui的基本元件。它會生成網格來呈現放置在畫布上的ui元素,當ui元素變化時,它會重新生成網格並向gpu發起繪圖呼叫,從而顯示出ui。

生成這些網格會消耗大量效能,需要將ui元素收集到批處理中,從而盡可能減少繪圖呼叫。因為批處理的生成過程效能消耗較大,通常只在必要時候才重新生成。問題在於,當畫布上有乙個或多個元素變化時,必須重新分析整塊畫布,才能得到繪製元素的最優方法。

許多使用者將整個遊戲的ui都放到一塊畫布,上面擺放了成百上千個元素。因此當修改其中乙個元素時,會產生持續數毫秒的cpu使用量飆公升情況。

每塊畫布上的元素都與其它畫布的元素相隔離,所以我們可以使用工具來切分畫布,從而解決unity ui的批處理問題。

我們也可以通過巢狀畫布來解決,這樣允許設計師建立大型分層ui,而且不必擔心不同內容出現在多個畫布上。子畫布的內容與父畫布和同級畫布相互隔離,它們會保持自帶幾何體,執行自己的批處理。

當使用子畫布分離畫布時,嘗試根據畫布更新時間來分組。例如:分離動態元素和靜態元素。

graphic raycaster元件能夠將輸入內容轉換為ui事件,它會把觸屏輸入轉為事件,然後傳送給相關ui元素。每個接收輸入內容的畫布都需要graphic raycaster元件,包括子畫布。

儘管該元件名為graphic raycaster,但它卻不是個光線投射器,預設情況下它只會測試ui圖形。該元件會獲取特定畫布上輸入資訊相關的ui元素集,然後執行交點測試,它會針對graphic raycaster的畫布上每個互動式ui元素的recttransform,檢查輸入事件發生的位置。

例如:有乙個帶文字的按鈕,關閉該元素的raycast target會直接減少graphic raycaster每幀進行的交點測試次數。

如果將畫布上的渲染模式設為世界空間攝像機(worldspace camera)或螢幕空間攝像機(screen space camera),此時可以設定阻擋遮罩(blocking mask)。

阻擋遮罩決定光線投射器是通過2d物理還是3d物理投射光線,從而了解特定物理物件是否阻擋使用者與ui互動。

儘量減少graphic raycaster的數量,不要將graphic raycaster新增到非互動式ui畫布上,因為這樣做無法檢查互動事件。

當設定畫布進行渲染時,不管該畫布是在世界空間還是攝像機的螢幕空間,都可以指定用於為ui中graphic raycaster生成互動事件的攝像機。渲染模式為「screen space - camera」的畫布需要使用該設定,該設定名為「render camera」。

然而在渲染模式為「world space」的畫布上,該設定是可選的,名為「event camera」。

如果將世界空間畫布的event camera欄位留空,這不意味著該畫布不會接收事件。它會使用遊戲的主攝像機。為了確定哪個攝像機是主攝像機,該畫布會訪問camera.main屬性。

根據unity所使用的**路徑,每幀中每有乙個graphic raycaster和世界空間畫布,該畫布會訪問7到10次camera.main。每次訪問camera.main都會呼叫object.findobjectwithtag。這個做法在執行時並不合適。

快取攝像機的引用,然後建立系統來跟蹤主攝像機。如果使用世界空間畫布,要指定event camera,不要將該屬性留空。如果需要修改event camera,編寫**來更新event camera屬性。

當修改布局系統的乙個或多個子元素時,會使布局變髒。修改後的子元素會使擁有該元素的布局系統(layout system)無效化。

簡單介紹一下布局系統:布局系統是一組連續的布局分組(layout group),它們在布局元素(layout element)之上。布局元素不只是名為layout element的元件,它們還包括ui影象、文字和scroll rect元件,而且scroll rect同時也是布局分組。

回到問題本身,每個使布局變髒的ui元素都會至少執行一次getcomponents呼叫,該呼叫會在布局元素父物件上尋找有效的布局分組。找到有效布局分組後,它會繼續遍歷transform層級,直到停止尋找分組或是到達層級的根部分,無論先滿足哪個條件都會停止尋找過程。因此。每個布局分組會給每個子布局元素的改變過程新增一次getcomponents呼叫,使巢狀布局分組的效能變差。

使用錨點進行比例布局。在擁有動態元素數量的活躍ui上,考慮編寫**來計算布局,僅在需要時執行該**,而不是每次發生改變的時候。

通常情況下,使用者通過重置父物件來聚集ui物件,然後再禁用物件,但這樣會造成不必要的汙染。

這樣操作僅會改變一次原有的層級,但在重置父物件時,要避免二次改變原有的父物件,也不要改變新的層級。如果要從物件池移除物件,首先重置它的父物件,然後更新資料,再啟用該物件。

有時需要隱藏ui元素和畫布,要怎樣高效完成該任務呢?

禁用canvas元件會阻止畫布向gpu發起繪圖呼叫,所以該畫布不再可見。然而,此時該畫布不會丟棄它的頂點緩衝區,它會保留所有網格和頂點,當重新啟用時不會觸發重構過程,它只會重新繪製畫布內容。

此外,禁用canvas元件不會觸發canvas層級上效能消耗較大的ondisable/onenable**。禁用子元件時要小心,注意它是否執行效能消耗較大的每幀**。

animator每幀都會改變元素,即使動畫中的數值沒有變化。animator沒有空指令檢查。

只在頻繁變化的動態元素上加入animator。對於很少變化的元素,或是僅響應事件時才變化的元素,請自行編寫**或補間系統,你可以在asset store資源商店找到許多補間系統外掛程式。

unity ui效能優化技巧

Unity UI拖拽優化

1.之前的拖拽都是直接拖拽 2.現在可以新增乙個層,拖拽哪個在該層實時例項化乙個對相應的即可,然後使跟隨滑鼠移動。這樣原始就不需要移動。指令碼準備 1.dragitem.cs 該指令碼掛預製件元素中,用來實際處理拖拽操作。using system.collections using system.c...

Oracle SQL 效能優化技巧

sun2004發表於 2008 12 25 11 28 眾所周知,資料庫設計的好壞直接關係到資料庫執行的效率。根據筆者的經驗,對於提公升資料庫效能來說,合理的資料庫設計,比公升級伺服器的硬體配置,還要來的有效。但是,筆者無論是在跟同事合作,又或者是在論壇上跟相關同行交流的時候,總是會發現有些人有一些...

Apache效能優化技巧

本文出自 本文簡要介紹了幾個優化 apache 的技巧,在實戰中十分有用。公升級 apache 到最新版本,新版本往往包含效能提公升和安全更新。在 httpd.conf 中設定 hostnamelookups off 能避免針對每個訪問者的 dns 網域名稱的反向查詢。採用另外一台伺服器處理檔案。保...