1. 程式人生 > >【總結】Unity遊戲優化

【總結】Unity遊戲優化

硬盤 技術 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
3、用Profiler優化
  • ProcessRemoteInput 是引擎在Editor下調用的東西……
  • Log中可以找到所有打包的資源(AssetHunter)
4、場景優化
  • 無用的組件比如Animation最好移除
  • 少用耗性能的碰撞體,比如mesh,wheel,sphere...尤其是移動端
  • 不要在場景預先放好太多東西,而是用動態生成,逐漸加載
  • 陰影=陰暗+影子,建議使用實時影子時把陰暗效果烘焙出來,不要使用燈光來調節光線陰暗。
  • 在效果相似時選擇最節能的。比如硬陰影,低分辨率貼圖,static光照烘焙,少用法線貼圖,優化粒子特效或用UV動畫
  • 大場景中使用線性霧,使遠距離對象或陰影不易察覺,因此可通過減小相機和陰影距離來提高性能
  • 使用遮擋剔除,LOD
  • 用skybox做遠景
5、資源加載優化
  • 使用對象池
  • 合並使用同貼圖的材質球,合並使用相同材質球的Mesh
  • 動畫文件我們是單獨分離出來的,以供多角色共用
  • 減少模型面數和總數。但是場景不用合並成一個mesh,這樣會使得同屏的面數增加
  • 將透明通道的對象置於TransparentFX圖層。Tag,Hieratchy,Layer養成良好的條理化習慣
  • Mesh的壓縮僅僅是減少打包文件的大小,並不會減少運行時的內存消耗。而減少動畫關鍵幀,則會讓兩者都有所減少,一般情況下我們都應該開啟。
  • 減少手機上使用的 .NET 庫的大小,通常用 .NET 2.0 Subset ,另外Unity會自動隨著API的使用提高安卓版本
Textures資源設置
  1. 對於Texture等資源來說, Unity會把資源再編碼成它自己的內部格式,所以源文件格式並不重要。而內部格式文件占空間越小,存儲空間優化就越好
  2. 可以用壓縮來優化存儲空間,但會損失一些時間,而且內存消耗不變
6、Shader優化
  1. 少使用的函數:pow,sin,cos等
  2. 用合適大小的數據類型
  3. 對於不支持的設備不使用逐像素、實時陰影、屏幕特效等畫面效果。Shader要做到平臺適用且高效
7、內存管理,GC回收
  1. Mono堆內存回收用 System.GC.Collect(); 可避免系統在不合適的時間進行自動GC
  2. Unity內存回收用 Resources.UnloadUnusedAssets(); 其內部本身也會調用 GC.Collect()
  3. AssetBundle.Unload 釋放AssetBundle文件內存鏡像
  4. Reources.UnloadAsset(Object) 釋放硬盤加載的所有Asset資源,慎用

【總結】Unity遊戲優化