? Unity模型、場景整合--美工制作優化事項 - 納金網

<tbody id="ap6ns"><div id="ap6ns"><address id="ap6ns"></address></div></tbody>
<track id="ap6ns"><span id="ap6ns"></span></track>

<track id="ap6ns"></track>

  • <option id="ap6ns"><span id="ap6ns"></span></option>

    <menuitem id="ap6ns"></menuitem>
  • <track id="ap6ns"><span id="ap6ns"><em id="ap6ns"></em></span></track>
  • <tbody id="ap6ns"></tbody>
    <track id="ap6ns"><span id="ap6ns"></span></track>
    1. 聯系我們

      給我們留言

      聯系我們

      地址:福建省晉江市青陽街道洪山路國際工業設計園納金網

      郵箱:info@narkii.com

      電話:0595-82682267

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

      當前位置:主頁 > 3D教程 > 圖文教程

      Unity模型、場景整合--美工制作優化事項

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

      相關文章
      網友評論

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

      關閉

      全部評論:0條

      推薦
      熱門
      婷婷五月色尤物国产最新在线|亚洲国产 另类 久久精品|国产福利一区二区精品秒拍|99久久精品国产免费男女

      <tbody id="ap6ns"><div id="ap6ns"><address id="ap6ns"></address></div></tbody>
      <track id="ap6ns"><span id="ap6ns"></span></track>

      <track id="ap6ns"></track>
      
      
    2. <option id="ap6ns"><span id="ap6ns"></span></option>

      <menuitem id="ap6ns"></menuitem>
    3. <track id="ap6ns"><span id="ap6ns"><em id="ap6ns"></em></span></track>
    4. <tbody id="ap6ns"></tbody>
      <track id="ap6ns"><span id="ap6ns"></span></track>