Unity 動態批處理和靜態批處理

2022-07-21 21:24:23 字數 1346 閱讀 8373

為了提高遊戲效能,降低遊戲執行時的drawcall,unity會對網格頂點進行批處理,而批處理又分成了動態批處理靜態批處理

優點:不用自己做任何事情,unity會在遊戲中自動進行動態批處理,只要滿足下述條件。

在unity中,要進行動態批處理需要滿足以下條件

原理:unity會檢測哪些gameobject使用了同乙個共享材質,然後去合併這些使用了同乙個共享材質的網格頂點資料,形成乙個新的大網格,然後傳給視訊記憶體,直接渲染這個大網格就相當於渲染了所有的被合併的小網格,而這只需要一次drawcall。

為什麼用了不同的材質,不同的貼圖,不同的材質屬性等會導致不能動態批處理呢?

在unity渲染其實也是呼叫的opengl或者是directx,因為我只了解過opengl,所以以opengl為例(directx也是同理)。opengl中要渲染乙個東西出來的,需要頂點著色器和片元著色器,這個對應的是shaderlab中的頂點著色器和片元著色器,然後還需要把要渲染的網格的頂點屬性作為乙個陣列繫結到vbo(頂點快取物件)中去,然後繫結vao(頂點陣列物件)並設定頂點陣列的屬性,然後一些需要外部設定的著色器屬性也是在這個階段進行設定,當做完這些之後,再呼叫gldrawelements(也就是一次drawcall)去渲染這個物體。這就是opengl渲染乙個東西的最簡單的流程。所以回到問題,為什麼貼圖,材質屬性等必須一樣呢?因為如果不一樣的話,他們就不能通過一次drawcall去設定這些屬性和貼圖了,想想看,如果a物體使用了貼圖a,b物體使用了貼圖b,如果把他們合併成乙個大網格,要直接在乙個drawcall裡渲染出來的話,這個合併好的大網格到底該用貼圖a還是貼圖b呢?無論使用哪個,都是不對的。所以a物體和b物體不能進行批處理。

需要做的事情:把要進行靜態批處理的gameobject在inspector面板右上角的static勾選(實際上只需要勾選batching static即可)

優點:因為只需要進行一次,所以效能會比動態批處理要好。

缺點:進行了靜態批處理之後的gameobject不能在遊戲執行時改變位置或者是跟渲染有關的屬性。並且因為把所有要靜態批處理的gameobject都合併成乙個大網格儲存起來,所以這實際上相當於即時是同乙個gameobject,也需要複製乙份網格資料一起儲存在這個大網格的頂點資料裡面去,這樣就導致了占用的記憶體變多了。

原理:在開始階段把需要靜態批處理的gameobject進行一次網格合併操作,然後把這個合併之後的大網格儲存起來,後續都是用這個網格而不需要再進行合併。

unity靜態批處理原理理解

1 靜態批處理的時間點 1 在遊戲匯出的時候,在player setting中勾選static batching,這樣在匯出包的時候就進行批處理,匯出來的包就會比較大 2 在遊戲場景中勾選場景物體的static選項,在載入該場景的時候,會進行一次靜態批處理的合併,這樣匯出來的包不大,但是在載入的時候...

unity 渲染批處理

unity 可以在執行時組合一系列物件,並使用單個繪製呼叫統一繪製。這種操作稱之為 批處理 unity 可以批處理的物件越多,可以獲得的渲染效能就越好 就 cpu 而言 只有共享同一種材質的物件才可以批處理。更改 renderer.material 將建立材料的副本,應該使用 renderer.sh...

動態對映和靜態對映

先說virtualalloc和virtualcopy virtualalloc 首先會從我們的虛擬位址空間中申請 或者說預留 一塊虛擬空間,準備接下來要用它。注意此時,可用的物理記憶體並沒有減少,只是虛擬位址少了一塊可用的區域。真正把這塊之前 reserved 的虛擬空間對映到物理的記憶體區域就是由...