- Unity3D高級編程:主程手記
- 陸澤西
- 908字
- 2022-01-07 14:46:25
4.2.1 UGUI系統(tǒng)的運行原理
UGUI是在3D網格下建立起來的UI系統(tǒng),它的每個可顯示的元素都是通過3D模型網格的形式構建起來的。當UI系統(tǒng)被實例化時,UGUI系統(tǒng)首先要做的就是構建網格。
也就是說,Unity3D在制作一個圖元,或者一個按鈕,或者一個背景時,都會先構建一個方形網格,再將圖片放入網格中。可以理解為構建了一個3D模型,用一個網格綁定一個材質球,材質球里存放要顯示的圖片。
這里有一個問題,如果每個元素都生成一個模型且綁定一個材質球存入一張圖片,那么界面上成千上萬個元素就會擁有成千上萬個材質球,以及成千上萬張圖。這樣使得引擎在渲染時就需要讀取成千上萬張圖以及成千上萬個材質球,如果GPU對每個材質球和網格都進行渲染,將會導致GPU的負擔重大,我們可以理解為一個材質球擁有一個drawcall會導致drawcall過高(drawcall的原理將在后面章節(jié)介紹)。
UGUI系統(tǒng)對這種情況進行了優(yōu)化,它將一部分相同類型的圖片集合起來合成一張圖,然后將擁有相同圖片、相同著色器的材質球指向同一個材質球,并且把分散開的模型網格合并起來,這樣就生成幾個大網格和幾個不同圖集的材質球,以及少許整張的圖集,節(jié)省了很多材質球、圖片、網格的渲染,UI系統(tǒng)的效率提升了很多,游戲在進行時也順暢了許多。這就是我們常常在UI系統(tǒng)制作中提到的圖集概念,它把很多張圖片放置在一張圖集上,使得大量的圖片和材質球不需要重復繪制,只要改變模型頂點上的UV和顏色即可。
UGUI系統(tǒng)并不是將所有的網格和材質球都合并成一個,因為這樣模型前后層級就會有問題,它只是把相同層級的元素,以及相同層級上的擁有相同材質球參數的進行合并處理。合并成一個網格,就相當于是一個靜止的模型,如果移動了任何元素,或者銷毀了任何元素,或者改變了任何元素的參數,原來合并的網格就不符合新的要求了,于是UGUI系統(tǒng)就會銷毀這個網格,并重新構建一個。我們設想一下,如果每時每刻都在移動一個元素,那么UGUI系統(tǒng)就會不停地拆分合并網格,也就會不停地消耗CPU來使得畫面保持應有的樣子。這些合并和拆分的操作會消耗很多CPU,我們要盡一切可能節(jié)省CPU內存,盡量把多余的CPU讓給核心邏輯。UGUI系統(tǒng)在制作完成后,性能優(yōu)劣差距很多時候都會出現(xiàn)在這里,我們要想方設法合并更多的元素,減少重構網格的次數,以達到更少的性能開銷目的。
- Apache Spark 2.x Machine Learning Cookbook
- arc42 by Example
- Oracle Database In-Memory(架構與實踐)
- Mastering Natural Language Processing with Python
- JavaScript 網頁編程從入門到精通 (清華社"視頻大講堂"大系·網絡開發(fā)視頻大講堂)
- Vue.js 3.x從入門到精通(視頻教學版)
- 快人一步:系統(tǒng)性能提高之道
- 微信小程序開發(fā)與實戰(zhàn)(微課版)
- Clojure for Machine Learning
- Troubleshooting Citrix XenApp?
- Android Sensor Programming By Example
- 算法訓練營:海量圖解+競賽刷題(入門篇)
- 人件集:人性化的軟件開發(fā)
- 前端Serverless:面向全棧的無服務器架構實戰(zhàn)
- Flask Web開發(fā)實戰(zhàn):入門、進階與原理解析