官术网_书友最值得收藏!

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)在這里,我們要想方設法合并更多的元素,減少重構網格的次數,以達到更少的性能開銷目的。

主站蜘蛛池模板: 开远市| 思南县| 河南省| 云和县| 沅江市| 威信县| 孟村| 碌曲县| 西吉县| 榆林市| 灌阳县| 诏安县| 七台河市| 融水| 宁南县| 长沙县| 富顺县| 东莞市| 郓城县| 南京市| 沂水县| 大埔区| 彭阳县| 沙湾县| 澄城县| 长沙县| 九龙县| 奉新县| 清徐县| 资溪县| 紫阳县| 汪清县| 苍山县| 大关县| 肥乡县| 渝北区| 朔州市| 康平县| 邻水| 康乐县| 宁乡县|