在此整理一些有關效能上需要注意的問題,主要資訊來源是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中所顯示的數據不同的現象。
參考資料
- http://docs.unity3d.com/Documentation/Manual/Meshes.html
- http://docs.unity3d.com/Documentation/Components/class-MeshRenderer.html
- http://docs.unity3d.com/Documentation/Manual/ModelingOptimizedCharacters.html
- 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平台有這項要求,因此製作貼圖時須遵守正方貼圖原則。
- http://docs.unity3d.com/Documentation/Manual/ReducingFilesize.html
- http://docs.unity3d.com/Documentation/Manual/Textures.html
- 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
沒有留言:
張貼留言