Spite 和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指令後,通過一系列流程生成最終要顯示的內容並進行渲染,其中大致的步驟包括:

  1. CPU發送Draw Call指令給GPU;

  2. GPU讀取必要的數據到自己的顯存;

  3. GPU通過頂點着色器(vertex shader)等步驟將輸入的幾何體信息轉化爲像素點數據;

  4. 每個像素都通過片段着色器(fragment shader)處理後寫入幀緩存;

  5. 當全部計算完成後,GPU將幀緩存內容顯示在屏幕上。

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

  1. Sprite由於頂點數據更加複雜,在第1/2步時會比Image效率更低;

  2. Sprite會比Image執行較多的頂點着色器運算;

  3. Image會比Sprite執行更多的片段着色器運算;

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

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

可以看出,SpriteRenderer確實是經過優化以顯示更多的元素的。所以在2D遊戲開發中,遊戲場景中的元素,應該儘量使用它去渲染。而Image應該僅用於UI顯示(實際上即使不考慮性能原因,由於屏幕分辨率的變化,Image可能會被Canvas改變顯示位置和實際大小,如果用於遊戲內元素的顯示,可能會造成跟預期設計不一致的顯示結果,也應該避免使用)。


參考:http://www.cnblogs.com/AaronBlogs/p/6863298.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章