U3D DrawCall優化手記

2021-08-20 09:02:44 字數 1768 閱讀 8607

在最近,使用u3d開發的遊戲核心部分功能即將完成,中間由於各種歷史原因,導致專案存在比較大的問題,這些問題在最後,恐怕只能通過一次徹底的重構來解決

現在的遊戲跑起來會有接近130-170個左右的drawcall,遊戲執行起來明顯感覺到卡,而經過一天的優化,drawcall成功縮減到30-70個,這個效果是非常顯著的,並且這個優化並沒有通過將現有的資源打包圖集來實現,圖集都是原有的圖集,如果從全域性的角度對圖集再進行一次優化,那麼drawcall還可以再減少十幾個

本次優化的重點包括:層級關係和特效

對於u3d,我是乙個菜鳥,對於u3d的一些東西是一知半解,例如drawcall,我得到的是一些並不完全正確的資訊,例如將n個紋理打包成乙個圖集,這個圖集就只會產生乙個drawcall,如果不打成圖集,那麼就會有n個drawcall,這個觀點在很多人的認識裡都是正確的,因為可以通過簡單的操作來驗證,但嚴格來說,這個觀點是錯誤的,因為它還受層級關係影響!

u3d的渲染是有順序的,u3d的渲染順序是由我們控制的,控制好u3d的渲染順序,你才能控制好drawcall

乙個drawcall,表示u3d使用這個材質/紋理,來進行一次渲染,那麼這次渲染假設有3個物件,那麼當3個物件都使用這乙個材質/紋理的時候,就會產生一次drawcall,可以理解為一次將紋理輸送到螢幕上的過程,(實際上引擎大多會使用如雙緩衝,快取這類的手段來優化這個過程,但在這裡我們只需要這樣子認識就可以了),假設3個物件使用不同的材質/紋理,那麼無疑會產生3個drawcall

接下來我們的3個物件使用2個材質,a和b使用材質1,c使用材質2,這時候來看,應該是有2個drawcall,或者3個drawcall。應該是2個drawcall啊,為什麼會有3個drawcall???而且是有時候2個,有時候3個。我們按照上面的drawcall分析流程來分析一下:

1.渲染a,使用材質1

2.渲染b,使用材質1

3.渲染c,使用材質2

在這種情況下是2個drawcall,在下面這種情況下,則是3個drawcall

1.渲染a,使用材質1

2.渲染c,使用材質2

3.渲染b,使用材質1

因為我們沒有控制好渲染順序(或者說沒有去特意控制),所以導致了額外的drawcall,因為a和b不是一次性渲染完的,而是被c打斷了,所以導致材質1被分為兩次渲染

那麼是什麼在控制這個渲染順序呢?首先在多個相機的情況下,u3d會根據相機的深度順序進行渲染,在每個相機中,它會根據你距離相機的距離,由遠到近進行渲染,在ui相機中,還會根據你ui物件的深度進行渲染

那麼我們要做的就是,對要渲染的物件進行一次規劃,正確地排列好它們,規則是,按照z軸或者深度,對空間進行劃分,然後確定好每個物件的z軸和深度,讓使用同乙個材質的東西,盡量保持在這個空間內,不要讓其他材質的物件進入這個空間,否則就會打斷這個空間的渲染順序

在這個基礎上,更細的規則有:

每個材質/紋理的渲染一定是會產生drawcall的,這個drawcall只能通過打包圖集來進行優化

製作圖集一般遵循幾個規則:

字元圖集,在使用bmfont或者其他工具生成字的時候,我們往往是直接匯入一大串文字,然後直接生成,但實際上這上面的操作也有優化空間,例如bmfont生成的大小,是可以設定的,有兩個規則,乙個規則是匯出的盡量小,另乙個是匯出的盡量少,預設的大小應該是512x512,假設你生成的256x256就可以容納,那麼多做乙個操作你可以節省這麼多空間,另外當你輸入多幾個字,就導致增加一張時,例如1024變成2048,那麼你可以考慮使用3張512的,這樣也會節省空間

經過精心劃分的圖集在加上精心規劃的渲染順序,drawcall會有乙個質的優化

完成drawcall的優化之後,接下來就是記憶體的優化了,

U3D初學概況

u3d介紹 2004年,英特爾 波音 adobe 3d資料編碼方式。而且傳統的三維檔案就是基於cs結構,本機系統,脫離源程式無法開啟和瀏覽,即使通過特定程式能夠開啟,也是以犧牲大量編輯修改功能作為代價,尤其是三維檔案一般都體積巨大,無法通過網際網路傳播 瀏覽!u3d的目標是結束諸如autodesk ...

u3d ngui螢幕適配

新開專案u3d,介面使用ngui。移動裝置的解析度多種多樣,對每一種解析度進行一次布局耗時耗力。經過老大的指導,找出一種一次布局適配多種解析度方法。在未進行適配設定之前,切換解析度之後會導致ui移位存在空白地方。但是ngui可以對元素 button,sprite等 進行錨點停靠。在anchors下面...

u3d shader入門寫法

星期二的時候,開始要做乙個按鈕切換的效果,功能就是點一下選擇鍵盤,再點一下,選擇藍芽搖桿,其實可以用很簡單,或者很笨,但能用的方法實現 2個png切換 最後決定用shader 真的對 shader一竅不通,結果足足花了2天才完成,1個小功能,2天還是很值得,起碼shader技能1級,get。其實前面...