2013年9月6日 星期五

[Unity] 效能上需要注意的事項


在此整理一些有關效能上需要注意的問題,主要資訊來源是Unity的Manual,其中可能有許多地方理解錯誤,請多包涵與指正。
  • Mesh

    • Mesh的渲染是由Renderer Component擔當,一個Renderer會消耗一次運算,當一個角色被拆分成N個Meshes,也就會有N次的運算,因此要儘可能的減少Mesh的數量。
    • GameObject上被Deactive的Renderer Component,依舊會佔用記憶體,只是不會被呈像出來。
    • Mesh的Hard Edge上的點,因為Vert的Normal不一致,所以會被視為多個Verts,而UV Border Edge上的Vert也是一樣,在渲染流程上會被視為多個點。在Unity中所顯示的Verts、Tris就是這個真實的數量(送給OpenGLES的點的數量),所以才會有與DCC Tool中所顯示的數據不同的現象。
參考資料


  • Compression Assets
    • Unity在匯入資源時,會自動進行壓縮,而你可以在Preference中取消這項設定讓編輯時可以省下壓縮的等待時間,但在建立遊戲時是一定會進行壓縮的,不受該項設定影響。
  • Mesh Import Settings
    • Mesh Compression可以減少檔案所佔容量,但不能減少運算時的記憶體消耗。
    • Mesh Optimization會優化點的順序增進GPU運算效能。
  • Textures
    • Normals、Tangents:
      若物件沒有使用到Normal map及Real-time Lighting的話,可以取消Normals。而物件沒有使用到Normal map的話,可以取消Tangents。
    • Anisotropic Filtering:
      是針對當Mesh的面與視角的夾角相當小時會獲得較好的貼圖品質(通常用於地板),但也會增加GPU的運算消耗,在Quality Settings中可以針對所有的貼圖進行設定。
    • 在Unity中貼圖必須為二的冪次方,非二的冪次方貼圖通常只用於GUI。
    • Unity沒有限制貼圖必須為正方形,然而在iOS平台有這項要求,因此製作貼圖時須遵守正方貼圖原則。
參考資料




  • Materials:
    • 在一個GameObject、Renderer上使用的Material是越少越好,最好只使用一個,每個Material都會增加一個Draw call。
  • Skinned Mesh:
    • Unity使用1、2、4根骨頭來計算控制一個頂點,因此在DCC Tool中進行綁定時,一個頂點的權重最多包含4根骨頭即可,在遊戲中實際使用幾根骨頭做運算是依據Quality Settings中的設定。
參考資料




  • Bones:
    • PC遊戲通常的骨頭數量是介議於15~60根間,而行動平台建低於30根。(Blade&Soul的玩家角色使用約130根左右,其中包含臉部、附加骨頭)若人物有使用IK,在匯入Unity後因已經過Bake程序,應把IK清除掉必免占用運算。
  • Animation Compression:
    • Keyframe Reduction
      在匯入時減少Keyframs數量,能夠減少檔案尺寸及記憶體消耗,而Compression只能減少檔案尺寸
  • Combine Children:
    • Combine Children這個Script可以進行combine meshes的動作,而要combine的物件得使用同一張圖,這個處理可以有效降低draw calls(將多個使用同一張貼圖同一個材質的Meshes合併為一個Mesh)。

//

Manual中有優化圖像效能的指引

CPU: optimizing Draw call count
GPU: optimizing Model geometry

http://docs.unity3d.com/Documentation/Manual/OptimizingGraphicsPerformance.html

沒有留言:

張貼留言