本次優化的重點包括:層級關係和特效
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只能通過打包圖集來進行優化
製作圖集一般遵循幾個規則:
不要一股腦把所有東西打包到乙個圖集裡,特別是那些不可能同時出現的東西,它們就不應該在乙個圖集裡,這樣的圖集意義不大,減少不了drawcall,並且乙個你不需要顯示的,會一直占用你的記憶體,這讓我非常不爽
注意控制圖集的大小,不要讓圖集太大,乙個超級大圖集的drawcall消耗或許頂的上十幾個小圖集的消耗
字元圖集,在使用bmfont或者其他工具生成字的時候,我們往往是直接匯入一大串文字,然後直接生成,但實際上這上面的操作也有優化空間,例如bmfont生成的大小,是可以設定的,有兩個規則,乙個規則是匯出的盡量小,另乙個是匯出的盡量少,預設的大小應該是512x512,假設你生成的256x256就可以容納,那麼多做乙個操作你可以節省這麼多空間,另外當你輸入多幾個字,就導致增加一張時,例如1024變成2048,那麼你可以考慮使用3張512的,這樣也會節省空間
經過精心劃分的圖集在加上精心規劃的渲染順序,drawcall會有乙個質的優化
Mysql limit 優化優化
mysql 效能到底能有多高?用了php半年多,真正如此深入的去思考這個問題還是從前天開始。有過痛苦有過絕望,到現在充滿信心!mysql 這個資料庫絕對是適合dba級的高手去玩的,一般做一點1萬篇新聞的小型系統怎麼寫都可以,用xx框架可以實現快速開發。可是資料量到了10萬,百萬至千萬,他的效能還能那...
php優化 nginx優化 mysql優化
php優化 1 將類的方法定義為static。2 盡量使用單引號。3 修改php fpm程序數。4 修改單個指令碼最大可使用記憶體。5 大的陣列使用完之後要及時釋放。6 迴圈的時候,制定最大迴圈次數 7 不使用 遮蔽錯誤 8 盡量採用大量的 php 內建函式 9 使用require代替require...
約瑟夫問題(優化優化再優化)
約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。1 模擬方法 2 數學方法 模擬方法就是所謂的乙個個模擬,乙個乙個出列...