Unity Sprite和UI Image的區別

2021-08-18 12:16:33 字數 1730 閱讀 6072

【參考原文】sprite和ui image的區別

unity3d最初是乙個3d遊戲引擎,而從4.3開始,系統加入了sprite元件,unity也終於有了2d遊戲開發的官方解決方案。4.6更是增加了新的ui系統ugui,使得使用unity開發2d遊戲效率非常高。

那麼對於從事2d遊戲開發的同學來說,想必都曾經遇到過2d元素渲染的選擇問題。大家都知道,unity可以將匯入的分割為若干sprite,然後通過spriterenderer元件或者ugui的image元件來渲染。一般情況下,兩者的顯示效果是一致的。那麼究竟該使用哪個元件呢?

首先分析下兩者的異同。

使用上,兩者區別不大,都是使用乙個sprite源進行渲染,而image需要位於某個canvas下才能顯示出來。場景中的sprite可以像普通的3d遊戲物體一樣對待,通過transform元件進行移動等操作,而image則使用recttransform進行布局,以便通過canvas統一管理。由於recttransform可以設定大小、對齊方式等,image可以說更加方便一點,這也是很多人選擇使用image的原因。

渲染上,sprite使用spriterenderer元件渲染,而image則由canvasrenderer元件渲染。兩者在視覺上沒有任何區別(都使用預設材質時)。它們預設的渲染也都是在transparent geometry佇列中。

而在引擎的處理上,兩者則有很大的不同。將wireframe選項開啟然後在場景中觀察,就可以清楚地發現,image會老老實實地為乙個矩形的sprite生成兩個三角形拼成的矩形幾何體,而sprite則會根據顯示內容,裁剪掉元素中的大部分透明區域,最終生成的幾何體可能會有比較複雜的頂點結構。

那麼這種不同會造成什麼結果呢?在繼續之前,我們先回顧一下遊戲中每幀的渲染過程。對任何物體的渲染,我們需要先準備好相關資料(頂點、uv、貼圖資料和shader引數等等),然後呼叫gpu的渲染介面進行繪製,這個過程稱作draw call。gpu接收到drawcall指令後,通過一系列流程生成最終要顯示的內容並進行渲染,其中大致的步驟包括:

cpu傳送draw call指令給gpu;

gpu讀取必要的資料到自己的視訊記憶體;

gpu通過頂點著色器(vertex shader)等步驟將輸入的幾何體資訊轉化為畫素點資料;

每個畫素都通過片段著色器(fragment shader)處理後寫入幀快取;

當全部計算完成後,gpu將幀快取內容顯示在螢幕上。

通過上面的認知,我們可以推斷:

sprite由於頂點資料更加複雜,在第1/2步時會比image效率更低;

sprite會比image執行較多的頂點著色器運算;

image會比sprite執行更多的片段著色器運算;

看起來似乎image比sprite有更大的好處,然而事實上,由於片段著色器是針對每個畫素運算,sprite通過增加頂點而裁剪掉的部分減少了相當多的運算次數,在絕大多數情況下,反而比image擁有更好的效率 —— 尤其是場景中有大量的2d精靈時。

總結一下,spriterenderer會建立額外的幾何體來裁剪掉多餘的透明畫素區域,從而減少了大量的片段著色器運算,並降低了overdraw;而image則會建立簡單的矩形幾何體。隨著2d元素數量的增加,這種差別會慢慢明顯起來。

可以看出,spriterenderer確實是經過優化以顯示更多的元素的。所以在2d遊戲開發中,遊戲場景中的元素,應該盡量使用它去渲染。而image應該僅用於ui顯示(實際上即使不考慮效能原因,由於螢幕解析度的變化,image可能會被canvas改變顯示位置和實際大小,如果用於遊戲內元素的顯示,可能會造成跟預期設計不一致的顯示結果,也應該避免使用)。

和 區別和聯絡, 和 區別和聯絡

和 區別和聯絡,和 區別和聯絡,實際專案中,什麼情況用哪種?首先,和 的聯絡 共同點 和 都可以用作 邏輯與 運算子,都是雙目運算子。具體要看使用時的具體條件來決定。無論使用哪種運算子,對最終的運算結果都沒有影響。情況1 當上述的運算元是boolean型別變數時,和 都可以用作邏輯與運算子。情況2 ...

rpx和樣式和class和flex

5 style 靜態的樣式統一寫到 class 中。style 接收動態的樣式,在執行時會進行解析,請盡量避免將靜態的樣式寫進 style 中,以免影響渲染速度。例 6 class 用於指定樣式規則,其屬性值是樣式規則中類選擇器名 樣式類名 的集合,樣式類名不需要帶上.樣式類名之間用空格分隔。關於f...

if和switch和for語句

if和switch很像。具體什麼場景下,應用那個語句呢?如果判斷的具體數值不多,而是符合byte,short,int,char,字串。這五種型別。雖然兩個語句都可以使用,建議使用switch語句,因為效率稍高。其他情況,對區間判斷,對結果為boolean型別判斷,使用if,if的使用範圍更廣。whi...