亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Unity中的靜態(tài)批處理和動態(tài)批處理操作

 更新時間:2021年04月10日 09:13:14   作者:Real_JumpChen  
這篇文章主要介紹了Unity中的靜態(tài)批處理和動態(tài)批處理操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

前言

Unity在運行時可以將一些物體進行合并,從而用一個繪制調用來渲染他們。這一操作,我們稱之為“批處理”,能得到越好的渲染性能。

Unity中內建的批處理機制所達到的效果要明顯強于使用幾何建模工具的批處理效果,因為,Unity引擎的批處理操作是在物體的可視裁剪操作之后進行的,處理的幾何信息少很多。

材質

只有擁有相同材質的物體才可以進行批處理,因此,你需在程序中盡可能多地復用材質。如果你的兩個材質僅僅是紋理不同,那么你可通過紋理拼合來將這兩張紋理拼合成一張大的紋理,這樣,你就可以使用這個單一材質來替代之前的兩個材質了。

如果你要通過腳本來訪問復用材質屬性,那么值得注意:改變Renderer.material將會造成一份材質的拷貝,因此,你應該使用Renderer.sharedMaterial來保證材質的共享狀態(tài)。

動態(tài)批處理

如果動態(tài)物體共用著相同的材質,那么Unity會自動對這些物體進行批處理,動態(tài)批處理操作是自動完成的,并不需要你進行額外的操作。

Dynamic Batching啟用時,Unity將嘗試自動批量移動物體到一個Draw Call中。要使物體可以被動態(tài)批處理,它們應該共享相同的材質,但是還有一些其他約束條件:

批處理動態(tài)物體需要在每個頂點上進行一定的開銷,所以動態(tài)批處理僅支持小于900頂點的網格物體;如果你的著色器使用頂點位置,法線和UV值三種屬性,那么你只能批處理300頂點以下的物體;如果你的著色器需要使用頂點位置,法線,UV0,UV1和切向量,那你只能批處理180頂點以下的物體。

盡量不要使用縮放尺度(scale)。分別擁有縮放尺度(1,1,1)和(2,2,2)的兩個物體將不會進行批處理;統(tǒng)一縮放尺度的物體不會與非統(tǒng)一縮放尺度的物體進行批處理。使用縮放尺度(1,1,1)和 (1,2,1)的兩個物體將不會進行批處理,但是使用縮放尺度(1,2,1)和(1,3,1)的兩個物體將可以進行批處理。

擁有光照貼圖的物體有其他渲染器參數(shù),例如光照貼圖索引或光照貼圖的偏移與縮放。一般來說,動態(tài)光照貼圖的游戲對象應該指向完全相同的光照貼圖的位置。

多通道(Pass)的shader會妨礙批處理操作。比如,幾乎unity中所有的著色器在前向渲染中都支持多個光源,并為它們有效地開辟多個通道,這就會要求額外的渲染次數(shù),所以繪制 “額外的每像素燈”時不會被批處理。

靜態(tài)批處理

為了更好地使用靜態(tài)批處理,你需要明確指出哪些物體是靜止的,并且在游戲中永遠不會移動、旋轉和縮放。想完成這一步,你只需要在檢測器(Inspector)中將Static復選框打勾即可。只要這些物體不移動,并且擁有相同的材質。因此,靜態(tài)批處理比動態(tài)批處理更加有效,你應該盡量低使用它,因為它需要更少的CPU開銷。

使用靜態(tài)批處理操作需要額外的內存開銷來儲存合并后的幾何數(shù)據(jù)。在靜態(tài)批處理之前,如果一些物體共用了同樣的幾何數(shù)據(jù),那么引擎會在編輯以及運行狀態(tài)對每個物體創(chuàng)建一個幾何數(shù)據(jù)的備份。這并不總是一個好的想法,因為有時候,將不得不犧牲一點渲染性能來防止一些物體的靜態(tài)批處理,從而保持較少的內存開銷。比如,將濃密森里中樹設為Static,會導致嚴重的內存開銷。這就是空間和時間上的相愛相殺。

最后,如果場景自帶靜態(tài)物體,會合并批次,這個大家都知道;如果靜態(tài)物體是場景加載后再讀取預制體動態(tài)加載進去的,就不會自動合并批次,需要你加載完后調一下手動合并批次的接口,StaticBatchingUtility.Combine 合并。

補充:在Unity3D中的渲染優(yōu)化-批處理技術

在Unity3D中,常用的減少Draw call的優(yōu)化技術就是批處理技術。批處理的原理是減少每一幀需要的Draw call數(shù)目。為了把一個對象渲染到屏幕上,CPU需要檢查哪些光源影響了該物體,綁定shader并設置它的參數(shù),再把渲染命令發(fā)送給GPU。當場景中包含了大量的對象時,這些操作就會非常耗時。例如,如果我們需要渲染一千個三角形,把它們按一千個單獨的網格進行渲染所花費的時間要遠遠大于渲染一個包含一千個三角形的網格。在這兩種情況下,GPU的性能消耗其實并沒有多大的區(qū)別,但CPU的draw call數(shù)目就會成為性能瓶頸。因此,批處理的思想很簡單,就是在每次調用draw call時盡可能多地處理多個物體。

使用同一材質的物體可以進行批處理,因為對于使用同一材質的物體,它們之間的不同僅僅在于頂點數(shù)據(jù)的差別。我們可以把這些頂點數(shù)據(jù)合并在一起,再一起發(fā)送給GPU,這樣就可以完成一次批處理。

在Unity中支持兩種類型的批處理,一種是動態(tài)批處理,另一種是靜態(tài)批處理。對于動態(tài)批處理來說,優(yōu)點是一切處理Unity自動完成的,不需要我們做任何操作,而且物體可以是移動的,缺點是限制有很多,可能一不小心就會破壞了這種機制,導致Unity無法動態(tài)批處理一些使用了相同材質的物體。而對于靜態(tài)批處理來說,它的優(yōu)點是自由度很高,限制很少;但缺點是可能會占用更多的內存,而經過靜態(tài)批處理后的所有物體都不可以再移動了(即便在腳本中嘗試改變物體的位置也是無效的)。

Unity3D中的動態(tài)批處理技術

動態(tài)批處理的原理是,每一幀把可以進行批處理的模型網格進行合并,再把合并后的模型數(shù)據(jù)傳遞給GPU,然后使用同一個材質對其渲染。除了實現(xiàn)方便,動態(tài)批處理的另一個好處就是,經過批處理的物體仍然可以移動,這是由于在處理每幀時Unity都會重新合并一次網格。

雖然Unity的動態(tài)批處理不需要我們進行任何額外工作,但只有滿足條件的模型和材質才可以被動態(tài)批處理。(需要注意的是,隨著Unity版本的變化,這些條件也有一些改變)這些條件限制是:

1.能夠進行動態(tài)批處理的網格的頂點屬性規(guī)模要小于900.例如,如果shader中需要使用頂點位置,法線和紋理坐標這三個頂點屬性,那么要想讓模型能夠被動態(tài)批處理,它的頂點數(shù)目不能超過300.需要注意的是,這個數(shù)字在未來有可能會發(fā)生變化,因此不要依賴這個數(shù)據(jù)。

2.一般來說,所有對象都需要使用同一縮放尺度(可以是(1,1,1),(1,2,3),(1.5,1.4,1.3)等,但必須都一樣)。一個例外情況是,如果所有的物體都是用了不同的非統(tǒng)一縮放,那么他們也是可以被動態(tài)批處理的。但在Unity5中,這種對模型縮放的限制已經不存在了。

3.對于使用光照貼圖紋理的物體需要小心處理。這些物體需要額外的渲染參數(shù),例如,在光照貼圖紋理上的索引和偏移量以及縮放信息等因此,為了讓這些物體可以被動態(tài)批處理,我們需要保證它們指向光照貼圖紋理中的同一個位置。

4.有多個Pass通道的shader會中斷批處理。在前向渲染中,我們有時需要使用額外的Pass來為模型添加更多的光照效果,但這樣一來模型就不會被動態(tài)批處理了。

Unity3D中的靜態(tài)批處理技術

靜態(tài)批處理的實現(xiàn)原理是,只在運行的開始階段,把需要進行靜態(tài)批處理的模型合并到一個新的網格結構中,這意味著這些模型不可以在運行時刻被移動。但由于它只需要進行一次合并操作,因此比動態(tài)批處理更加高效。但靜態(tài)批處理的缺點是需要占用更多的內存來存儲合并后的幾何結構。這時因為,如果在靜態(tài)批處理前一些物體共享了相同的網格,那么在內存中每一個物體都會對應一個該網格的復制品,即一個網格會變成多個網格再發(fā)送給GPU。如果這類使用相同網格的對象很多,那么這就會成為一種性能瓶頸了。例如,如果在一個使用了1000個相同樹模型的森林中使用靜態(tài)批處理,那么就會多使用1000倍的內存,這會造成嚴重的內存影響。這時的解決方法就是要么忍受這種犧牲內存換取性能的方法,要么不要使用靜態(tài)批處理,而使用動態(tài)批處理技術(但要小心控制模型的頂點屬性數(shù)目),或者自己編寫批處理方法。

在Unity中使用靜態(tài)批處理的方法是,在場景中選中需要靜態(tài)批處理的物體,在其Inspector面板的右上角勾選上Batching static靜態(tài)屬性。在內部實現(xiàn)上,Unity首先把這些靜態(tài)物體變換到世界空間下,然后為它們構建一個更大的頂點和索引緩存,對于使用同一材質的物體。Unity只需要調用一個drawcall就可以繪制全部物體。而對于使用不同材質的物體,靜態(tài)批處理同樣可以提升渲染性能。盡管這些物體仍然需要調用多個draw call,但靜態(tài)批處理可以減少這些draw call之間的狀態(tài)切換,而這些切換往往是費時的操作。

我們可以在Unity的分析器中觀察到應用靜態(tài)批處理前后VBO total(Vertex Buffer Object,頂點緩存對象)的變化。在一些物體共享了相同的網格的情況下,我們可以看到這些物體在使用了靜態(tài)批處理技術后,VBO total的數(shù)目變大了,這正是因為靜態(tài)批處理會占用更多內存的緣故。正如上面所講,靜態(tài)批處理需要占用更多的內存來存儲合并后的幾何結構,如果一些物體共享了相同的網格,那么在內存中每個物體都會對應一個該網格的復制品。

如果場景中包含了除了平行光以外的其他光源,并且在Shader中定義了額外的Pass來處理它們,這些額外的Pass部分是不會被批處理的,但是處理平行光的Base Pass部分仍然會被靜態(tài)批處理。

Unity3D中使用共享材質

無論是動態(tài)批處理還是靜態(tài)批處理,都要求模型之間需要共享同一個材質。但不同的模型之間總會需要有不同的渲染屬性,例如,使用不同的紋理,顏色等。這時我們需要一些策略來盡可能的合并材質。

如果兩個材質之間只有使用的紋理不同,我們可以把這些紋理合并到一張更大的紋理中,這張更大紋理被稱為是一張圖集(atlas)。一旦使用了同一紋理,我們就可以使用同一材質,再使用不同的采樣坐標對紋理采樣即可。

但有時除了紋理不同外,不同的物體在材質上還有一些微小的參數(shù)變化,例如,顏色不同,某些浮點屬性不同。但是,不管是動態(tài)批處理還是靜態(tài)批處理,它們的前提都是使用同一個材質。是同一個,而不是使用了同一shader的材質,也就是說它們指向的材質必須是同一個實體。這意味著,只要我們調整了參數(shù),就會影響到所欲使用這個材質的對象。那么想要微小的調整怎么辦呢?一種常用的方法就是使用網格的頂點數(shù)據(jù)來存儲這些參數(shù)(最常見的就是頂點顏色數(shù)據(jù))。

經過批處理后的物體會被處理成更大的VBO發(fā)送給GPU,VBO中的數(shù)據(jù)可以作為輸入傳遞給頂點著色器,因此,我們可以巧妙地對VBO中的數(shù)據(jù)進行控制,從而達到不同效果的目的。一個例子就是,森林場景中的所有樹使用了同一材質,我們希望它們可以通過批處理來減少draw call,但不同樹的顏色可能不同。這時,我們可以利用網格頂點的顏色數(shù)據(jù)來調整。

需要注意的是,如果我們需要在腳本中訪問共享材質,應該使用Renderer.sharedMaterial來保證修改的是和其他物體共享的材質,但這意味著修改會應用到所有使用該材質的物體上。另一個類似的API是Renderer.material,如果使用Renderer.material來修改材質,Unity會創(chuàng)建一個該材質的復制品,從而破壞批處理在該物體上的應用。

關于在Unity3D中使用批處理的注意事項:

1.盡可能的使用靜態(tài)批處理,但要時刻小心對內存的消耗,并且記住經過靜態(tài)批處理的物體不可以再被移動。

2.如果無法進行靜態(tài)批處理,而要使用動態(tài)批處理的話,那么盡可能減少物體的數(shù)目并且讓這些物體包含少量的頂點屬性和頂點數(shù)目。

3.對于游戲中的小道具,例如可以撿拾的金幣等,可以使用動態(tài)批處理。

4.對于動畫的這類物體,我們無法全部使用靜態(tài)批處理,但其中如果有不動的部分,可以把這部分標識成“Static”。

5.由于批處理需要把模型變換到世界空間下再合并它們,因此,如果shader中存在一些基于模型空間下坐標的運算,那么往往會得到錯誤的結果。一個解決方法是,在shader中使用DisableBatching標簽強制使該shader的材質不會被批處理。

6.使用半透明材質的物體通常需要使用嚴格的從后往前的繪制順序來保證透明混合的正確性。這意味著,當繪制順序無法滿足時,批處理無法在這些物體上被成功地應用。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關文章

  • C#使用HttpClient對大文件進行斷點上傳和下載

    C#使用HttpClient對大文件進行斷點上傳和下載

    這篇文章主要介紹了C#如何使用HttpClient對大文件進行斷點上傳和下載,文章通過代碼示例講解的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2024-06-06
  • WPF Slider滑動條的顏色修改方法

    WPF Slider滑動條的顏色修改方法

    這篇文章主要介紹了WPF Slider滑動條的顏色修改方法,需要的朋友可以參考下
    2018-08-08
  • .NET單點登陸的實現(xiàn)方法及思路

    .NET單點登陸的實現(xiàn)方法及思路

    這篇文章介紹了.NET單點登陸的實現(xiàn)方法及思路,有需要的朋友可以參考一下,希望對你有所幫助
    2013-07-07
  • C#端口掃描器的編寫方法

    C#端口掃描器的編寫方法

    這篇文章主要為大家詳細介紹了C#端口掃描器的編寫方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C#逆變與協(xié)變詳解

    C#逆變與協(xié)變詳解

    這篇文章主要為大家詳細介紹了C#逆變與協(xié)變的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • C# Stack堆棧的使用方法

    C# Stack堆棧的使用方法

    最近打算學習下C# Stack堆棧的使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2009-01-01
  • C#中using的使用方式詳解

    C#中using的使用方式詳解

    這篇文章主要介紹了C#中using的使用方式方式詳解,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • C#并發(fā)容器之ConcurrentDictionary與普通Dictionary帶鎖性能詳解

    C#并發(fā)容器之ConcurrentDictionary與普通Dictionary帶鎖性能詳解

    這篇文章主要介紹了C#并發(fā)容器之ConcurrentDictionary與普通Dictionary帶鎖性能詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C#算法之無重復字符的最長子串

    C#算法之無重復字符的最長子串

    這篇文章介紹了C#算法之無重復字符的最長子串,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • Unity使用ScrollRect制作翻頁

    Unity使用ScrollRect制作翻頁

    這篇文章主要為大家詳細介紹了Unity使用ScrollRect制作翻頁,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評論