? 中文字幕在线精品无码一区,日韩欧美中文字幕电影
聯(lián)系我們

給我們留言

聯(lián)系我們

地址:福建省晉江市青陽街道洪山路國際工業(yè)設(shè)計園納金網(wǎng)

郵箱:info@narkii.com

電話:0595-82682267

(周一到周五, 周六周日休息)

當(dāng)前位置:主頁 > 3D教程 > 圖文教程

Unity模型、場景整合--美工制作優(yōu)化事項

來源: csdn | 責(zé)任編輯:六月芳菲 | 發(fā)布時間: 2018-08-10 09:51 | 瀏覽量:
1.Draw Call Batching優(yōu)化
首先我們要先理解為何2個沒有使用相同材質(zhì)的物體即使使用批處理,也無法實現(xiàn)Draw Call數(shù)量的下降和性能上的提升。
因為被“批處理”的2個物體的網(wǎng)格模型需要使用相同材質(zhì)的目的,在于其紋理是相同的,這樣才可以實現(xiàn)同時渲染的目的。因而保證材質(zhì)相同,是為了保證被渲染的紋理相同。
因此,為了將2個紋理不同的材質(zhì)合二為一,我們就需要進(jìn)行上面列出的第二步,將紋理打包成圖集。具體到合二為一這種情況,就是將2個紋理合成一個紋理。這樣我們就可以只用一個材質(zhì)來代替之前的2個材質(zhì)了。
而Draw Call Batching本身,也還會細(xì)分為2種。
Static Batching 靜態(tài)批處理
看名字,猜使用的情景。
靜態(tài)?那就是不動的咯。還有呢?額,聽上去狀態(tài)也不會改變,沒有“生命”,比如山山石石,樓房校舍啥的。那和什么比較類似呢?嗯,聰明的各位一定覺得和場景的屬性很像吧!所以我們的場景似乎就可以采用這種方式來減少draw call了。
那么寫個定義:只要這些物體不移動,并且擁有相同的材質(zhì),靜態(tài)批處理就允許引擎對任意大小的幾何物體進(jìn)行批處理操作來降低描繪調(diào)用。
那要如何使用靜態(tài)批來減少Draw Call呢?你只需要明確指出哪些物體是靜止的,并且在游戲中永遠(yuǎn)不會移動、旋轉(zhuǎn)和縮放。想完成這一步,你只需要在檢測器(Inspector)中將Static復(fù)選框打勾即可,如下圖所示:
2.減少繪制的數(shù)目
那么第一個方面的優(yōu)化也就是減少頂點數(shù)量,簡化復(fù)雜度,具體的舉措就總結(jié)如下了:
·保持材質(zhì)的數(shù)目盡可能少。這使得Unity更容易進(jìn)行批處理。
·使用紋理圖集(一張大貼圖里包含了很多子貼圖)來代替一系列單獨的小貼圖。它們可以更快地被加載,具有很少的狀態(tài)轉(zhuǎn)換,而且批處理更友好。
·如果使用了紋理圖集和共享材質(zhì),使用Renderer.sharedMaterial 來代替Renderer.material 。
·使用光照紋理(lightmap)而非實時燈光。
·使用LOD,好處就是對那些離得遠(yuǎn),看不清的物體的細(xì)節(jié)可以忽略。
·遮擋剔除(Occlusion culling)
·使用mobile版的shader。因為簡單。
3.優(yōu)化建議二:
a.PC平臺的話保持場景中顯示的頂點數(shù)少于200K~3M,移動設(shè)備的話少于10W,一切取決于你的目標(biāo)GPU與CPU。
b.如果你用U3D自帶的SHADER,在表現(xiàn)不差的情況下選擇Mobile或Unlit目錄下的。它們更高效。
c.盡可能共用材質(zhì)。
d.將不需要移動的物體設(shè)為Static,讓引擎可以進(jìn)行其批處理。
e.盡可能不用燈光。
f.動態(tài)燈光更加不要了。
g.嘗試用壓縮貼圖格式,或用16位代替32位。
h.如果不需要別用霧效(fog)
i.嘗試用OcclusionCulling,在房間過道多遮擋物體多的場景非常有用。若不當(dāng)反而會增加負(fù)擔(dān)。
j.用天空盒去“褪去”遠(yuǎn)處的物體。
k.shader中用貼圖混合的方式去代替多重通道計算。
l.shader中注意float/half/fixed的使用。
m.shader中不要用復(fù)雜的計算pow,sin,cos,tan,log等。
n.shader中越少Fragment越好。
o.注意是否有多余的動畫腳本,模型自動導(dǎo)入到U3D會有動畫腳本,大量的話會嚴(yán)重影響消耗CPU計算。
p.注意碰撞體的碰撞層,不必要的碰撞檢測請舍去。
4.假設(shè)你有一個上千三角面的模型卻用上千個三角型模型來代替,在GPU上花費是差不多的,但是在CPU上則是極其不一樣,消耗會大很多很多。為了讓CPU更少的工作,需要減少可見物的數(shù)目,可以采取以下措施:
a.合并相近的模型,手動在模型編輯器中合并或者使用UNITY的Draw call批處理達(dá)到相同效果(Draw call batching)。具體方法和注意事項查看以下鏈接:Draw call batching : http://docs.unity3d.com/Documentation/Manual/DrawCallBatching.html
b.在項目中使用更少的材質(zhì)(material),將幾個分開的貼圖合成一個較大的圖集等方式處理。(有一個合并模型材質(zhì)不錯的插件叫Mesh Baker,大家可以考慮試下。)
6.關(guān)于光照
若不用光肯定是最快的。移動端優(yōu)化可以采用用光照貼圖(Lightmapping)去烘培一個靜態(tài)的貼圖,以代替每次的光照計算,在U3D中只需要非常短的時間則能生成。這個方法能大大提高效率,而且有著更好的表現(xiàn)效果(平滑過渡處理,還有附加陰影等)。
在移動設(shè)備上和低端電腦上盡量不要在場景中用真光,用光照貼圖。這個方法大大節(jié)省了CPU和GPU的計算,CPU得到了更少的DRAWCALL,GPU則需要更少頂點處理和像素柵格化。
Lightmapping : http://docs.unity3d.com/Documentation/Manual/Lightmapping.html
7.對GPU的優(yōu)化——圖片壓縮和多重紋理格式
Compressed Textures(圖片壓縮):
http://docs.unity3d.com/Documentation/Components/class-Texture2D.html
圖片壓縮將降低你的圖片大?。ǜ斓丶虞d更小的內(nèi)存跨度(footprint)),而且大大提高渲染表現(xiàn)。壓縮貼圖比起未壓縮的32位RGBA貼圖占用內(nèi)存帶寬少得多。
之前U3D會議還聽說過一個優(yōu)化,貼圖盡量都用一個大小的格式(512 * 512 , 1024 * 1024),這樣在內(nèi)存之中能得到更好的排序,而不會有內(nèi)存之間空隙。這個是否真假沒得到過測試。
MIPMAps(多重紋理格式):
http://docs.unity3d.com/Documentation/Components/class-Texture2D.html
跟網(wǎng)頁上的略縮圖原理一樣,在3D游戲中我們?yōu)橛螒虻馁N圖生成多重紋理貼圖,遠(yuǎn)處顯示較小的物體用小的貼圖,顯示比較大的物體用精細(xì)的貼圖。這樣能更加有效的減少傳輸給GPU中的數(shù)據(jù)。
8.LOD 、 Per-Layer Cull Distances 、 Occlusion Culling
LOD (Level Of Detail) 是很常用的3D游戲技術(shù)了,其功能理解起來則是相當(dāng)于多重紋理貼圖。在以在屏幕中顯示模型大小的比例來判斷使用高或低層次的模型來減少對GPU的傳輸數(shù)據(jù),和減少GPU所需要的頂點計算。
攝像機分層距離剔除(Per-Layer Cull Distances):為小物體標(biāo)識層次,然后根據(jù)其距離主攝像機的距離判斷是否需要顯示。
遮擋剔除(Occlusion Culling)其實就是當(dāng)某個物體在攝像機前被另外一個物體完全擋住的情況,擋住就不發(fā)送給GPU渲染,從而直接降低DRAW CALL。不過有些時候在CPU中計算其是否被擋住則會很耗計算,反而得不償失。
以下是這幾個優(yōu)化技術(shù)的相關(guān)使用和介紹:
Level Of Detail :
http://docs.unity3d.com/Documentation/Manual/LevelOfDetail.html
Per-Layer Cull Distances :
http://docs.unity3d.com/Documentation/ScriptReference/Camera-layerCullDistances.html
Occlusion Culling :
http://docs.unity3d.com/Documentation/Manual/OcclusionCulling.html
9.優(yōu)化: 
① 更新不透明貼圖的壓縮格式為ETC 4bit,因為android市場的手機中的GPU有多種,
每家的GPU支持不同的壓縮格式,但他們都兼容ETC格式,
②對于透明貼圖,我們只能選擇RGBA 16bit 或者RGBA 32bit。
10.地形
·地形的分辨率大小
長寬均盡量小于257。這是因為地形太大,會造成大量頂點數(shù)據(jù),給你的內(nèi)存帶寬造成一定的影響,在目前的ios設(shè)備中,內(nèi)存帶寬是非常有限的,需要盡量節(jié)省。同時,如果用Unity自帶的地形,一定也要使用Occlusion Culling,因為Unity的刷地形工具雖然方便,但卻是framekiller,刷過之后,你會發(fā)現(xiàn)drawcall增加的非常多。
·混合紋理數(shù)量
不要超過4。地形的混合操作是很耗時的,應(yīng)該盡量避免。能合并的紋理盡量合并。
11.紋理
·紋理格式
建議png或tga。不用轉(zhuǎn)成ios硬件支持的PVRTC格式,因為Unity在發(fā)布時會幫你自動轉(zhuǎn)的。
·紋理尺寸
長寬小于1024。同時應(yīng)該盡可能地小,夠用就好,以保證紋理對內(nèi)存帶寬的影響達(dá)到最小。
·支持Mipmap
建議生成Mipmap。雖然這種做法會增加一些應(yīng)用程序的大小,但在游戲運行時,系統(tǒng)會根據(jù)需求應(yīng)用Mipmap來渲染,從而減少內(nèi)存帶寬。
·檢查Alpha值
如果紋理的alpha通道均為1,則用RGB的24位紋理來代替RGBA的32位紋理。(據(jù)說Unity內(nèi)部會進(jìn)行自動檢測)
12.光源
·光源“Important”個數(shù)
建議1個,一般為方向光。“Important”個數(shù)應(yīng)該越小越少。個數(shù)越多,drawcall越多。
·Pixel Light數(shù)目
1-2個。
13.粒子特效
·屏幕上的最大粒子數(shù)
建議小于200個粒子。
·每個粒子發(fā)射器發(fā)射的最大粒子數(shù)
建議不超過50個。
·粒子大小
如果可以的話,粒子的size應(yīng)該盡可能地小。因為Unity的粒子系統(tǒng)的shader無論是alpha test還是alpha blending都是一筆不小的開銷。同時,對于非常小的粒子,建議粒子紋理去掉alpha通道。
·盡量不要開啟粒子的碰撞功能。
非常耗時。
14.音頻
·游戲中播放時間較長的音樂(如背景音樂)
使用.ogg或.mp3的壓縮格式。
·較短音樂(如槍聲)
使用.wav和.aif的未壓縮音頻格式。
15.相機
·裁剪平面
將遠(yuǎn)平面設(shè)置成合適的距離。遠(yuǎn)平面過大會將一些不必要的物體加入渲染,降低效率。
·根據(jù)不同的物體設(shè)置不同的遠(yuǎn)裁剪平面
Unity提供了可以根據(jù)不同的layer來設(shè)置不同的view distance,所以我們可以實現(xiàn)將物體進(jìn)行分層,大物體層設(shè)置的可視距離大些,而小物體層可以設(shè)置地小些,另外,一些開銷比較大的實體(如粒子系統(tǒng))可以設(shè)置得更小些等等。
16.碰撞
·盡量不用MeshCollider
如果可以的話,盡量不用MeshCollider,以節(jié)省不必要的開銷。如果不能避免的話,盡量用減少Mesh的面片數(shù),或用較少面片的代理體來代替。
17.其他
·Drawcall
盡可能地減少Drawcall的數(shù)量。IOS設(shè)備上建議不超過100。減少的方法主要有如下幾種:Frustum Culling,Occlusion Culling,Texture Packing。Frustum Culling是Unity內(nèi)建的,我們需要做的就是尋求一個合適的遠(yuǎn)裁剪平面;Occlusion Culling,遮擋剔除,Unity內(nèi)嵌了Umbra,一個非常好OC庫。但Occlusion Culling也并不是放之四海而皆準(zhǔn)的,有時候進(jìn)行OC反而比不進(jìn)行還要慢,建議在OC之前先確定自己的場景是否適合利用OC來優(yōu)化;Texture Packing,或者叫Texture Atlasing,是將同種shader的紋理進(jìn)行拼合,根據(jù)Unity的static batching的特性來減少draw call。建議使用,但也有弊端,那就是一定要將場景中距離相近的實體紋理進(jìn)行拼合,否則,拼合后很可能會增加每幀渲染所需的紋理大小,加大內(nèi)存帶寬的負(fù)擔(dān)。這也就是為什么會出現(xiàn)“DrawCall降了,渲染速度也變慢了”的原因。
·非運動物體盡量打上Static標(biāo)簽
Unity在運行時會對static物體進(jìn)行自動優(yōu)化處理,所以應(yīng)該盡可能將非運行實體勾上static標(biāo)簽。
·場景中盡可能地使用prefab
盡可能地使用prefab的實例化物體,以降低內(nèi)存帶寬的負(fù)擔(dān)。檢查實體的PrefabType,盡量將其變成PrefabInstance,而不是ModelPrefabInstance。
·盡量減少alphaTest和alphaBlend材質(zhì)的使用。在手機上,這是很殺效率的。
·網(wǎng)格:如果可能的話,把相鄰的物體(網(wǎng)格)合并為一個只有一個材質(zhì)的物體(網(wǎng)格)。比如,你的游戲中包含一個桌子,上面有一堆東西,你完全可以在3D程序中將它們合并在一起(這可能也需要你將這些物體的紋理合并為一個大的紋理集)。減少需要渲染的物體的數(shù)量可以極大地提高游戲性能。
·性能占用順序:聚光燈>點光源>平行光。
一個好的點亮場景的方法就是先得到你想要的效果,然后看看哪些光更重要;
在保持光效的前提下看看哪些光可以去掉。
點光源和聚光燈只影響它們范圍內(nèi)的網(wǎng)格。
如果一個網(wǎng)格處于點光源或者聚光燈的照射范圍之外,并且光源的attenuate開關(guān)是打開的,那么這個網(wǎng)格將不會被光源所影響,這樣就可以節(jié)省性能開銷。
這樣做理論上來講可以使用很多小的點光源而且依然能有一個好的性能,因為這些光源只影響一小部分物體。
一個網(wǎng)格在有8個以上光源影響的時候,只響應(yīng)前8個最亮的光源。
18.模型方面優(yōu)化三
    ·合并使用同貼圖的材質(zhì)球,合并使用相同材質(zhì)球的Mesh;
  ·角色的貼圖和材質(zhì)球只要一個,若必須多個則將模型離分離為多個部分;
  ·骨骼系統(tǒng)不要使用太多;
  ·當(dāng)使用多角色時,將動畫單獨分離出來;
  ·使用層距離來控制模型的顯示距離;
  ·陰影其實包含兩方面陰暗和影子,建議使用實時影子時把陰暗效果烘焙出來,不要使用燈光來調(diào)節(jié)光線陰暗。
  ·少用像素?zé)艉褪褂孟袼責(zé)舻腟hader;
    ·如果硬陰影可以解決問題就不要用軟陰影,并且使用不影響效果的低分辨率陰影;
  ·實時陰影很耗性能,盡量減小產(chǎn)生陰影的距離;
  ·允許的話在大場景中使用線性霧,這樣可以使遠(yuǎn)距離對象或陰影不易察覺,因此可以通過減小相機和陰影距離來提高性能;
  ·使用圓滑組來盡量減少模型的面數(shù);
  ·項目中如果沒有燈光或?qū)ο笤谝苿幽敲淳筒灰褂脤崟r燈光;
  ·水面、鏡子等實時反射/折射的效果單獨放在Water圖層中,并且根據(jù)其實時反射/折射的范圍來調(diào)整;
  ·碰撞對效率的影響很小,但碰撞還是建議使用Box、Sphere碰撞體;
  ·建材質(zhì)球時盡量考慮使用Substance;
  ·盡量將所有的實時反射/折射(如水面、鏡子、地板等等)都集合成一個面;
  ·假反射/折射沒有必要使用過大分辨率,一般64*64就可以,不建議超過256*256;
  ·需要更改的材質(zhì)球,建議實例化一個,而不是使用公共的材質(zhì)球;
  ·將不須射線或碰撞事件的對象置于IgnoreRaycast圖層;
  ·將水面或類似效果置于Water圖層
  將透明通道的對象置于TransparentFX圖層;
  ·養(yǎng)成良好的標(biāo)簽(Tags)、層次(Hieratchy)和圖層(Layer)的條理化習(xí)慣,將不同的對象置于不同的標(biāo)簽或圖層,三者有效的結(jié)合將很方便的按名稱、類別和屬性來查找;
    ·通過Stats和Profile查看對效率影響最大的方面或?qū)ο?,或者使用禁用部分模型的方式查看問題到底在哪兒;
  ·使用遮擋剔除(Occlusion Culling)處理大場景,一種較原生的類LOD技術(shù),并且能夠“分割”作為整體的一個模型。

相關(guān)文章
網(wǎng)友評論

您需要登錄后才可以發(fā)帖 登錄 | 立即注冊

關(guān)閉

全部評論:0條

推薦
熱門