【總結】Unity遊戲優化
阿新 • • 發佈:2018-02-20
硬盤 技術 wheel mes stringbu 臨時 ets 減少 e30 1、Profiler中一項"WaitForTargetFPS"費資源過高的原因
畫面撕裂,顯卡渲染輸出的速度與顯示器不同步, 如果顯示器刷新的同時,顯卡創造了新的幀,就會出現上半顯示器顯示前一幀,下半顯示器刷新到下一幀畫面的“撕裂”現象。常見於高幀數顯卡與低幀數顯示器上~
垂直同步(V-Sync),通過延時讓顯卡等顯示器輸出完畢後再“生產”下一幀畫面,將遊戲幀數鎖定到和你的顯示器刷新頻率一樣,從而達到畫面的同步。
WaitForTargetFPS,是用於防止撕裂的。WaitForTargetFPS消耗越高,說明被壓縮的幀數越多,Setting裏關掉垂直同步就可以了
FreeSync 技術則是讓顯示器的刷新率不再固定為60Hz,成為一個動態變量,當顯卡完整渲染完一張畫面後,顯示器就可以輸出了。 最大化發揮顯卡性能,不會因垂直同步而掉幀
2、代碼細節優化
- 協程比Update節能,盡量不要在update函數中做復雜計算,有需要可以隔N幀計算一次
- 不用的事件函數如Update應該刪除
- 簡化計算,如用乘法代替除法,少用復雜的數學函數,用合適的精度
- 減少使用臨時變量,盡量優化循環的時間空間復雜度
- 減少動態的生成字符串,用StringBuilder
- 減少使用Find,GetComponent等耗時API,可以在start中預先存起來
- 減少函數調用棧,用x = (x > 0 ? x : -x);代替x = Mathf.Abs(x)
- 盡量不要在方法中動態new array,推薦用類變量或者傳入參數
- OnGUI少用,最好只在一個腳本中使用。用UGUI
- ProcessRemoteInput 是引擎在Editor下調用的東西……
- Log中可以找到所有打包的資源(AssetHunter)
- 無用的組件比如Animation最好移除
- 少用耗性能的碰撞體,比如mesh,wheel,sphere...尤其是移動端
- 不要在場景預先放好太多東西,而是用動態生成,逐漸加載
- 陰影=陰暗+影子,建議使用實時影子時把陰暗效果烘焙出來,不要使用燈光來調節光線陰暗。
- 在效果相似時選擇最節能的。比如硬陰影,低分辨率貼圖,static光照烘焙,少用法線貼圖,優化粒子特效或用UV動畫
- 大場景中使用線性霧,使遠距離對象或陰影不易察覺,因此可通過減小相機和陰影距離來提高性能
- 使用遮擋剔除,LOD
- 用skybox做遠景
- 使用對象池
- 合並使用同貼圖的材質球,合並使用相同材質球的Mesh
- 動畫文件我們是單獨分離出來的,以供多角色共用
- 減少模型面數和總數。但是場景不用合並成一個mesh,這樣會使得同屏的面數增加
- 將透明通道的對象置於TransparentFX圖層。Tag,Hieratchy,Layer養成良好的條理化習慣
- Mesh的壓縮僅僅是減少打包文件的大小,並不會減少運行時的內存消耗。而減少動畫關鍵幀,則會讓兩者都有所減少,一般情況下我們都應該開啟。
- 減少手機上使用的 .NET 庫的大小,通常用 .NET 2.0 Subset ,另外Unity會自動隨著API的使用提高安卓版本
- 對於Texture等資源來說, Unity會把資源再編碼成它自己的內部格式,所以源文件格式並不重要。而內部格式文件占空間越小,存儲空間優化就越好
- 可以用壓縮來優化存儲空間,但會損失一些時間,而且內存消耗不變
- 少使用的函數:pow,sin,cos等
- 用合適大小的數據類型
- 對於不支持的設備不使用逐像素、實時陰影、屏幕特效等畫面效果。Shader要做到平臺適用且高效
- Mono堆內存回收用 System.GC.Collect(); 可避免系統在不合適的時間進行自動GC
- Unity內存回收用 Resources.UnloadUnusedAssets(); 其內部本身也會調用 GC.Collect()
- AssetBundle.Unload 釋放AssetBundle文件內存鏡像
- Reources.UnloadAsset(Object) 釋放硬盤加載的所有Asset資源,慎用
【總結】Unity遊戲優化